Sdílet prostřednictvím


Primární klíč, cizí klíč a jedinečný klíč s využitím vyhrazeného fondu SQL ve službě Azure Synapse Analytics

Seznamte se s omezeními tabulek ve vyhrazeném fondu SQL, včetně primárního klíče, cizího klíče a jedinečného klíče.

Omezení tabulky

Vyhrazený fond SQL podporuje tato omezení tabulek:

  • PRIMÁRNÍ KLÍČ se podporuje pouze v případech, kdy se používají neclusterované klíče i NEVYNUCOVANÉ.
  • Omezení UNIQUE je podporováno pouze při použití funkce NOT VYNUCENO.

Syntaxi najdete v části ALTER TABLE a CREATE TABLE.

Omezení CIZÍHO KLÍČE se ve vyhrazeném fondu SQL nepodporuje.

Poznámky

Primární klíč nebo jedinečný klíč umožňuje vyhrazenému modulu fondu SQL vygenerovat optimální plán provádění dotazu. Všechny hodnoty ve sloupci primárního klíče nebo ve sloupci s jedinečným omezením by měly být jedinečné.

Důležité

Po vytvoření tabulky s primárním klíčem nebo jedinečným omezením ve vyhrazeném fondu SQL musí uživatelé zajistit, aby všechny hodnoty v těchto sloupcích byly jedinečné. Porušení může způsobit, že dotaz vrátí nepřesný výsledek.

Tento příklad ukazuje, jak dotaz může vrátit nepřesný výsledek, pokud sloupec primárního klíče nebo jedinečného omezení obsahuje duplicitní hodnoty.

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

Příklady

Vytvořte tabulku vyhrazeného fondu SQL s primárním klíčem:

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

Vytvořte tabulku vyhrazeného fondu SQL s jedinečným omezením:

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

Další kroky

Po vytvoření tabulek pro vyhrazený fond SQL je dalším krokem načtení dat do tabulky. Kurz načítání najdete v tématu Načítání dat do vyhrazeného fondu SQL.