Ограничения в Azure Databricks

Azure Databricks поддерживает стандартные предложения SQL для управления ограничениями. Ограничения можно разделить на две категории:

  • Принудительные ограничения обеспечивают автоматическую проверку качества и целостности данных, добавляемых в таблицу.
  • Информационные ограничения первичного ключа и внешнего ключей кодируют связи между полями в таблицах и не являются принудительными.

Для всех ограничений в Azure Databricks требуется Delta Lake.

В Delta Live Tables реализована похожая концепция, известная как ожидания. См. статью Управление качеством данных с помощью Delta Live Tables.

Принудительные ограничения в Azure Databricks

При нарушении ограничения транзакция завершается ошибкой. Поддерживаются два типа ограничений:

  • NOT NULL: указывает, что значения в указанных столбцах не могут иметь значение null.
  • CHECK: указывает, что заданное логическое выражение должно возвращать значение true для каждой входной строки.

Важно!

При добавлении ограничения автоматически обновляется версия протокола записи таблиц, если предыдущая версия этого протокола была ниже версии 3. Узнайте, как Azure Databricks управляет совместимостью функций Delta Lake? Чтобы понять управление версиями протоколов таблиц и что означает обновление версии протокола.

Установка ограничения NOT NULL в Azure Databricks

Примечание.

  • Инструкция SET NOT NULL доступна в Databricks Runtime 7.4 и более поздних версий.

Ограничения NOT NULL в схеме указываются при создании таблицы. Для удаления или добавления ограничений NOT NULL используйте команду ALTER TABLE ALTER COLUMN.

CREATE TABLE people10m (
  id INT NOT NULL,
  firstName STRING,
  middleName STRING NOT NULL,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
) USING DELTA;

ALTER TABLE people10m ALTER COLUMN middleName DROP NOT NULL;
ALTER TABLE people10m ALTER COLUMN ssn SET NOT NULL;

Перед добавлением ограничения NOT NULL в таблицу Azure Databricks проверяет, действительно ли все существующие строки соответствуют ограничению.

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

См. статьи CREATE TABLE [USING] и ALTER TABLE ALTER COLUMN.

Установка ограничения CHECK в Azure Databricks

Управление ограничениями CHECK осуществляется с помощью команд ALTER TABLE ADD CONSTRAINT и ALTER TABLE DROP CONSTRAINT. ALTER TABLE ADD CONSTRAINT проверяет, действительно ли все существующие строки соответствуют ограничению, прежде чем добавлять их в таблицу.

CREATE TABLE people10m (
  id INT,
  firstName STRING,
  middleName STRING,
  lastName STRING,
  gender STRING,
  birthDate TIMESTAMP,
  ssn STRING,
  salary INT
) USING DELTA;

ALTER TABLE people10m ADD CONSTRAINT dateWithinRange CHECK (birthDate > '1900-01-01');
ALTER TABLE people10m DROP CONSTRAINT dateWithinRange;

См. разделы ALTER TABLE ADD CONSTRAINT и ALTER TABLE DROP CONSTRAINT.

Ограничения CHECK предоставляются как свойства таблицы в выходных данных команд DESCRIBE DETAIL и SHOW TBLPROPERTIES.

ALTER TABLE people10m ADD CONSTRAINT validIds CHECK (id > 1 and id < 99999999);

DESCRIBE DETAIL people10m;

SHOW TBLPROPERTIES people10m;

Объявление связей первичного ключа и внешнего ключа

Важно!

Эта функция предоставляется в режиме общедоступной предварительной версии.

Примечание.

  • Ограничения первичного ключа и внешнего ключей доступны в Databricks Runtime 11.1 и более поздних версиях.
  • Для ограничений первичного ключа и внешнего ключей требуются Unity Catalog и Delta Lake.

Связи по первичному и внешнему ключам можно использовать для полей в таблицах Unity Catalog. Первичные и внешние ключи являются информационными и не применяются принудительно. Внешние ключи должны ссылаться на первичный ключ в другой таблице.

Первичные и внешние ключи можно объявить как часть предложения спецификации таблицы при создании этой таблицы. Это предложение не следует использовать с инструкциями CTAS. Вы также можете добавить ограничения для существующих таблиц.

CREATE TABLE T(pk1 INTEGER NOT NULL, pk2 INTEGER NOT NULL,
                CONSTRAINT t_pk PRIMARY KEY(pk1, pk2));
CREATE TABLE S(pk INTEGER NOT NULL PRIMARY KEY,
                fk1 INTEGER, fk2 INTEGER,
                CONSTRAINT s_t_fk FOREIGN KEY(fk1, fk2) REFERENCES T);

Вы можете запросить information_schema или использовать DESCRIBE для получения сведений о применении ограничений в определенном каталоге.

См.