Chave primária, chave estrangeira e chave exclusiva usando o pool de SQL dedicado no Azure Synapse Analytics

Saiba mais sobre as restrições de tabela no pool de SQL dedicado, incluindo chave primária, chave estrangeira e chave exclusiva.

Restrições de tabela

O pool de SQL dedicado dá suporte a estas restrições de tabela:

  • Há suporte para PRIMARY KEY somente quando NONCLUSTERED e NOT ENFORCED são usados.
  • Há suporte para a restrição UNIQUE somente quando NOT ENFORCED é usado.

Para sintaxe, marque ALTER TABLE e CREATE TABLE.

Não há suporte para a restrição FOREIGN KEY no pool de SQL dedicado.

Comentários

Ter a chave primária e/ou a chave exclusiva permite que o mecanismo de pool de SQL dedicado gere um plano de execução ideal para uma consulta. Todos os valores em uma coluna de chave primária ou uma coluna de restrição única devem ser exclusivos.

Importante

Depois de criar uma tabela com uma restrição de chave primária ou exclusiva no pool de SQL dedicado, os usuários precisam garantir que todos os valores nessas colunas sejam exclusivos. Uma violação disso pode fazer com que a consulta retorne um resultado impreciso.

Este exemplo mostra como uma consulta pode retornar um resultado impreciso se a coluna de restrição de chave primária ou exclusiva tiver valores duplicados.

 -- Create table t1
CREATE TABLE t1 (a1 INT NOT NULL, b1 INT) WITH (DISTRIBUTION = ROUND_ROBIN)

-- Insert values to table t1 with duplicate values in column a1.
INSERT INTO t1 VALUES (1, 100)
INSERT INTO t1 VALUES (1, 1000)
INSERT INTO t1 VALUES (2, 200)
INSERT INTO t1 VALUES (3, 300)
INSERT INTO t1 VALUES (4, 400)

-- Run this query.  No primary key or unique constraint.  4 rows returned. Correct result.
SELECT a1, COUNT(*) AS total FROM t1 GROUP BY a1

/*
a1          total
----------- -----------
1           2
2           1
3           1
4           1

(4 rows affected)
*/

-- Add unique constraint
ALTER TABLE t1 ADD CONSTRAINT unique_t1_a1 unique (a1) NOT ENFORCED

-- Re-run this query.  5 rows returned.  Incorrect result.
SELECT a1, count(*) AS total FROM t1 GROUP BY a1

/*
a1          total
----------- -----------
2           1
4           1
1           1
3           1
1           1

(5 rows affected)
*/

-- Drop unique constraint.
ALTER TABLE t1 DROP CONSTRAINT unique_t1_a1

-- Add primary key constraint
ALTER TABLE t1 add CONSTRAINT PK_t1_a1 PRIMARY KEY NONCLUSTERED (a1) NOT ENFORCED

-- Re-run this query.  5 rows returned.  Incorrect result.
SELECT a1, COUNT(*) AS total FROM t1 GROUP BY a1

/*
a1          total
----------- -----------
2           1
4           1
1           1
3           1
1           1

(5 rows affected)
*/

-- Manually fix the duplicate values in a1
UPDATE t1 SET a1 = 0 WHERE b1 = 1000

-- Verify no duplicate values in column a1 
SELECT * FROM t1

/*
a1          b1
----------- -----------
2           200
3           300
4           400
0           1000
1           100

(5 rows affected)
*/

-- Add unique constraint
ALTER TABLE t1 add CONSTRAINT unique_t1_a1 UNIQUE (a1) NOT ENFORCED  

-- Re-run this query.  5 rows returned.  Correct result.
SELECT a1, COUNT(*) as total FROM t1 GROUP BY a1

/*
a1          total
----------- -----------
2           1
3           1
4           1
0           1
1           1

(5 rows affected)
*/

-- Drop unique constraint.
ALTER TABLE t1 DROP CONSTRAINT unique_t1_a1

-- Add primary key contraint
ALTER TABLE t1 ADD CONSTRAINT PK_t1_a1 PRIMARY KEY NONCLUSTERED (a1) NOT ENFORCED

-- Re-run this query.  5 rows returned.  Correct result.
SELECT a1, COUNT(*) AS total FROM t1 GROUP BY a1

/*
a1          total
----------- -----------
2           1
3           1
4           1
0           1
1           1

(5 rows affected)
*/

Exemplos

Criar uma tabela de pool de SQL dedicado com uma chave primária:

CREATE TABLE mytable (c1 INT PRIMARY KEY NONCLUSTERED NOT ENFORCED, c2 INT);

Criar uma tabela de pool de SQL dedicado com uma restrição exclusiva:

CREATE TABLE t6 (c1 INT UNIQUE NOT ENFORCED, c2 INT);

Próximas etapas

Depois de criar as tabelas para o pool de SQL dedicado, a próxima etapa é carregar dados na tabela. Para obter um tutorial de carregamento, confira Carregando dados no pool de SQL dedicado.