Chiave primaria, chiave esterna e chiave univoca usando un pool SQL dedicato in Azure sinapsi AnalyticsPrimary key, foreign key, and unique key using dedicated SQL pool in Azure Synapse Analytics

Informazioni sui vincoli di tabella nel pool SQL dedicato, inclusi chiave primaria, chiave esterna e chiave univoca.Learn about table constraints in dedicated SQL pool, including primary key, foreign key, and unique key.

Vincoli di tabellaTable constraints

Il pool SQL dedicato supporta i vincoli di tabella seguenti:Dedicated SQL pool supports these table constraints:

  • La chiave primaria è supportata solo se vengono usati entrambi non CLUSTER e non applicati.PRIMARY KEY is only supported when NONCLUSTERED and NOT ENFORCED are both used.
  • Il vincolo UNIQUE è supportato solo se viene usato non applicato.UNIQUE constraint is only supported with NOT ENFORCED is used.

Per la sintassi, controllare ALTER TABLE e Create Table.For syntax, check ALTER TABLE and CREATE TABLE.

Il vincolo FOREIGN KEY non è supportato nel pool SQL dedicato.FOREIGN KEY constraint is not supported in dedicated SQL pool.

OsservazioniRemarks

La presenza di chiave primaria e/o chiave univoca consente al motore del pool SQL dedicato di generare un piano di esecuzione ottimale per una query.Having primary key and/or unique key allows dedicated SQL pool engine to generate an optimal execution plan for a query. Tutti i valori in una colonna chiave primaria o in una colonna vincolo univoca devono essere univoci.All values in a primary key column or a unique constraint column should be unique.

Dopo aver creato una tabella con una chiave primaria o un vincolo UNIQUE nel pool SQL dedicato, gli utenti devono assicurarsi che tutti i valori di tali colonne siano univoci.After creating a table with primary key or unique constraint in dedicated SQL pool, users need to make sure all values in those columns are unique. Una violazione di che può causare la restituzione di risultati non accurati nella query.A violation of that may cause the query to return inaccurate result. In questo esempio viene illustrato come una query può restituire risultati non accurati se la colonna PRIMARY KEY o unique constraint include valori duplicati.This example shows how a query may return inaccurate result if the primary key or unique constraint column includes duplicate values.

 -- 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)
*/

EsempiExamples

Creare una tabella del pool SQL dedicata con una chiave primaria:Create a dedicated SQL pool table with a primary key:

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

Creare una tabella del pool SQL dedicata con un vincolo UNIQUE:Create a dedicated SQL pool table with a unique constraint:

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

Passaggi successiviNext steps

Dopo aver creato le tabelle per il pool SQL dedicato, il passaggio successivo consiste nel caricare i dati nella tabella.After creating the tables for your dedicated SQL pool, the next step is to load data into the table. Per un'esercitazione sul caricamento, vedere caricamento di dati in un pool SQL dedicato.For a loading tutorial, see Loading data to dedicated SQL pool.