Partilhar via


Chave primária, chave externa e chave exclusiva com o conjunto de SQL dedicado no Azure Synapse Analytics

Saiba mais sobre as restrições de tabelas no conjunto de SQL dedicado, incluindo chave primária, chave externa e chave exclusiva.

Restrições de tabela

O Conjunto de SQL dedicado suporta estas restrições de tabela:

  • A CHAVE PRIMÁRIA só é suportada quando são utilizadas as funções NONCLUSTERED e NOT ENFORCED.
  • A restrição EXCLUSIVA só é suportada quando NÃO É IMPOSTA.

Para sintaxe, selecione ALTER TABLE e CREATE TABLE.

A restrição DE CHAVE EXTERNA não é suportada no conjunto de SQL dedicado.

Observações

Ter chave primária e/ou chave exclusiva permite que o motor de conjunto de SQL dedicado gere um plano de execução ideal para uma consulta. Todos os valores numa coluna de chave primária ou numa coluna de restrição exclusiva devem ser exclusivos.

Importante

Depois de criar uma tabela com chave primária ou restrição exclusiva no conjunto de SQL dedicado, os utilizadores têm de se certificar de que todos os valores nessas colunas são exclusivos. Uma violação pode fazer com que a consulta devolva um resultado impreciso.

Este exemplo mostra como uma consulta pode devolver um resultado impreciso 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 conjunto de SQL dedicada com uma chave primária:

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

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

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

Passos seguintes

Depois de criar as tabelas para o conjunto de SQL dedicado, o próximo passo é carregar dados para a tabela. Para obter um tutorial de carregamento, veja Carregar dados para o conjunto de SQL dedicado.