Partilhar via


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

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

Restrições de tabela

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

  • A CHAVE PRIMÁRIA só é suportada quando NONCLUSTERED e NOT ENFORCED são usados.
  • A restrição UNIQUE só é suportada quando NOT ENFORCED é usado.

Para sintaxe, marque ALTER TABLE e CREATE TABLE.

A restrição FOREIGN KEY não é suportada no pool SQL dedicado.

Observações

Ter chave primária e/ou chave exclusiva permite que o mecanismo de pool 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 exclusiva devem ser exclusivos.

Importante

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

Este exemplo mostra como uma consulta pode retornar resultados imprecisos se a chave primária ou a coluna de restrição exclusiva incluir 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 constraint
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

Crie uma tabela de pool SQL dedicada com uma chave primária:

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

Crie uma tabela de pool SQL dedicada com uma restrição exclusiva:

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

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