Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure Databricks поддерживает стандартные предложения управления ограничениями SQL:
- Принудительное ограничение проверяет целостность данных перед добавлением строк в таблицу.
- Информационные ограничения (первичный ключ, внешний ключ и уникальные ограничения) определяют связи между полями в таблицах и не применяются.
Для всех ограничений в Azure Databricks требуется Delta Lake.
Сведения о смежной концепции в конвейерах Lakeflow см. в статье Управление качеством данных с помощью ожидаемых характеристик конвейера.
Принудительное ограничение
При нарушении ограничения транзакция завершается ошибкой. Azure Databricks поддерживает два типа ограничений:
-
NOT NULL: указывает, что значения в определенных столбцах не могут иметь значение NULL. -
CHECK: указывает, что заданное логическое выражение должно возвращать значение true для каждой входной строки.
Note
Добавление ограничения обновляет протокол записи таблицы, если текущая версия модуля записи меньше 3. Это может повлиять на совместимость с внешними клиентами Delta Lake. См. сведения о совместимости функций Delta Lake и протоколах.
Ограничение NOT NULL
При создании таблицы укажите NOT NULL ограничения в схеме. Чтобы убрать или добавить NOT NULL ограничения после создания, используйте команду ALTER TABLE ... ALTER COLUMN . Следующий пример создаёт people_demo таблицу, которую остальная часть этого раздела повторно использует:
CREATE OR REPLACE TABLE main.default.people_demo (
id INT NOT NULL,
firstName STRING,
middleName STRING NOT NULL,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
ssn STRING,
salary INT
);
ALTER TABLE main.default.people_demo ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE main.default.people_demo ALTER COLUMN ssn SET NOT NULL;
Azure Databricks проверяет, удовлетворяют ли все существующие строки ограничению перед добавлением ограничения NOT NULL в таблицу.
Если указать ограничение NOT NULL для столбца, вложенного в структуру, родительская структура также должна быть не NULL. Столбцы, вложенные в массив или типы карт, не принимают NOT NULL ограничения.
См. CREATE TABLE [ИСПОЛЬЗОВАНИЕ] и ALTER TABLE ALTER COLUMN.
Ограничение CHECK
Управление CHECK ограничениями с помощью ALTER TABLE ADD CONSTRAINT команд и ALTER TABLE DROP CONSTRAINT команд.
ALTER TABLE ADD CONSTRAINT Проверяет, удовлетворяют ли все существующие строки ограничению перед добавлением ограничения в таблицу.
Следующие ограничения применяются к ограничениям проверки:
-
CHECKВыражение ограничения может использовать любые функции SQL в Spark, которые всегда возвращают тот же результат при указании одинаковых значений аргументов, за исключением следующих типов функций:- Определяемые пользователем функции.
- Агрегатные функции.
- Функции окна.
- Функции, возвращающие несколько строк.
Добавление в существующую таблицу
Следующий пример добавляет CHECK ограничение к таблице, people_demo созданной в предыдущем разделе, а затем удаляет его:
ALTER TABLE main.default.people_demo ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE main.default.people_demo DROP CONSTRAINT dateWithinRange;
См. ALTER TABLE ADD CONSTRAINT и ALTER TABLE DROP CONSTRAINT.
Просмотр свойств таблицы ограничений проверки
Используйте команды DESCRIBE DETAIL и SHOW TBLPROPERTIES, чтобы увидеть ограничения CHECK таблицы. Следующий пример добавляет ограничение к people_demo, затем отображает его:
ALTER TABLE main.default.people_demo ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);
DESCRIBE DETAIL main.default.people_demo;
SHOW TBLPROPERTIES main.default.people_demo;
Удаление ограничений проверки
В Databricks Runtime 15.4 LTS и более поздних версиях используйте DROP FEATURE команду для удаления ограничений проверки из таблицы и понижения уровня протокола таблицы.
См. Управление функцией удаления таблицы Delta Lake и понижение протокола таблицы.
Объявление первичных ключей, внешнего ключа и уникальных ограничений
Первичный ключ, внешний ключ и уникальные ограничения являются информационными и не применяются. Они могут повысить производительность с помощью оптимизации запросов.
- Первичный ключ и внешний ключ: доступны для таблиц каталога Unity и Delta Lake в Databricks Runtime 13.3 LTS и выше. Общедоступная версия в Databricks Runtime 15.2 и более поздних версий. Внешние ключи должны ссылаться на первичный ключ или уникальное ограничение в другой таблице.
-
Уникальность: доступна в рамках общедоступной предварительной версии для таблиц Unity Catalog и Delta Lake в Databricks SQL и Databricks Runtime 18.2 и выше. Таблица может иметь несколько уникальных ограничений. Внешние ключи могут ссылаться на уникальный столбец с помощью
REFERENCES parent_table(unique_col). Уникальные столбцы могут иметь значение NULL, так какNULLзначения обрабатываются как отличные друг от друга.
Выполните запрос information_schema, используйте DESCRIBE TABLE EXTENDED или SHOW CREATE TABLE, чтобы получить сведения о том, как ограничения применяются в указанном каталоге.
Добавление в новые таблицы
Объявите первичные ключи, внешние ключи и уникальные ограничения в рамках предложения спецификации таблицы во время создания таблицы:
CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL PRIMARY KEY,
fk1 INTEGER, fk2 INTEGER,
CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL,
CONSTRAINT u_uq_email UNIQUE(email));
Операторы CTAS не поддерживают это предложение ограничения.
Добавление в существующие таблицы
Или добавить те же ограничения к уже существующим таблицам. Этот подход даёт тот же результат, что и предыдущий раздел. Следующий пример воссоздаёт T, S, и U без ограничений, затем добавляет каждое ограничение с ALTER TABLE ADD CONSTRAINT. Добавьте первичный ключ перед внешним ключом, который на него ссылается:
CREATE OR REPLACE TABLE main.default.T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL);
CREATE OR REPLACE TABLE main.default.S(pk INTEGER NOT NULL, fk1 INTEGER, fk2 INTEGER);
CREATE OR REPLACE TABLE main.default.U(id INTEGER NOT NULL, email STRING NOT NULL);
ALTER TABLE main.default.T ADD CONSTRAINT t_pk PRIMARY KEY(pk1, pk2);
ALTER TABLE main.default.S ADD CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES main.default.T;
ALTER TABLE main.default.U ADD CONSTRAINT u_uq_email UNIQUE(email);