Первичный ключ, внешний ключ и уникальный ключ при использовании выделенного пула SQL в Azure Synapse Analytics

Узнайте об ограничениях на уровне таблиц в выделенном пуле SQL, включая первичный ключ, внешний ключ и уникальный ключ.

Ограничения таблиц

Выделенный пул SQL поддерживает следующие ограничениях на уровне таблиц:

  • PRIMARY KEY поддерживается только при одновременном использовании NONCLUSTERED и NOT ENFORCED;
  • Ограничение UNIQUE поддерживается только при использовании NOT ENFORCED.

Синтаксис см. в описании команд ALTER TABLE и CREATE TABLE.

Ограничение FOREIGN KEY в выделенном пуле SQL не поддерживается.

Remarks

Наличие первичного и (или) уникального ключа позволяет обработчику выделенного пула SQL создать оптимальный план выполнения для запроса. Все значения в столбце первичного ключа или столбце уникального ограничения должны быть уникальными.

Важно!

После создания таблицы с ограничением PRIMARY KEY или UNIQUE в выделенном пуле SQL пользователям нужно убедиться, что все значения в этих столбцах уникальные. Нарушение этого требования приведет к тому, что результат запроса будут неточным.

В этом примере показано, как запрос может вернуть неточный результат, если столбец первичного ключа или уникального ограничения содержит повторяющиеся значения.

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

Примеры

Создайте таблицу в выделенном пуле SQL с первичным ключом:

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

Создайте таблицу в выделенном пуле SQL с ограничением UNIQUE:

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

Дальнейшие действия

После создания таблиц для выделенного пула SQL переходите к загрузке данных в таблицу. Дополнительные сведения см. в статье Загрузка данных в выделенный пул SQL.