Dela via


Primärnyckel, sekundärnyckel och unik nyckel med dedikerad SQL-pool i Azure Synapse Analytics

Lär dig mer om tabellbegränsningar i en dedikerad SQL-pool, inklusive primärnyckel, sekundärnyckel och unik nyckel.

Tabellbegränsningar

Den dedikerade SQL-poolen stöder följande tabellbegränsningar:

  • PRIMÄRNYCKEL stöds endast när både NONCLUSTERED och NOT ENFORCED används.
  • UNIK begränsning stöds endast när NOT ENFORCED används.

Om du vill ha syntax kontrollerar du ALTER TABLE och CREATE TABLE.

VILLKOR FÖR SEKUNDÄRNYCKEL stöds inte i en dedikerad SQL-pool.

Kommentarer

Med primärnyckel och/eller unik nyckel kan dedikerad SQL-poolmotor generera en optimal körningsplan för en fråga. Alla värden i en primärnyckelkolumn eller en unik villkorskolumn ska vara unika.

Viktigt

När du har skapat en tabell med primärnyckel eller unik begränsning i en dedikerad SQL-pool måste användarna se till att alla värden i dessa kolumner är unika. Ett brott mot detta kan leda till att frågan returnerar ett felaktigt resultat.

Det här exemplet visar hur en fråga kan returnera felaktiga resultat om den primära nyckeln eller den unika begränsningskolumnen innehåller dubblettvärden.

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

Exempel

Skapa en dedikerad SQL-pooltabell med en primärnyckel:

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

Skapa en dedikerad SQL-pooltabell med en unik begränsning:

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

Nästa steg

När du har skapat tabellerna för din dedikerade SQL-pool är nästa steg att läsa in data i tabellen. En självstudie om inläsning finns i Läsa in data till en dedikerad SQL-pool.