Ограничения
В SQL ограничения могут быть заданы для таблиц. Ограничения обеспечивают определенные свойства данных, которые вставляются в таблицу. Ограничения могут быть заданы вместе со схемой таблицы в рамках CREATE TABLE оператора. В некоторых случаях ограничения также могут быть добавлены к таблице с помощью ALTER TABLE оператора, но это не поддерживается для всех ограничений.
Предупреждение Ограничения сильно влияют на производительность: они замедляют загрузку и обновления, но ускоряют определенные запросы. Для получения подробной информации см. Руководство по производительности.
Синтаксис
Ограничение проверки
Ограничения проверки позволяют указать произвольное булево выражение. Любые столбцы, которые не удовлетворяют этому выражению, нарушают ограничение. Например, мы можем потребовать, чтобы столбец name не содержал пробелов, используя следующее CHECK ограничение.
CREATE TABLE students (name VARCHAR CHECK (NOT contains(name, ' ')));
INSERT INTO students VALUES ('this name contains spaces'); Constraint Error: CHECK constraint failed: students
Ограничение не NULL
Ограничение not-null задаёт условие, что столбец не может содержать какие-либо NULL значения. По умолчанию все столбцы в таблицах могут быть NULL. Добавление NOT NULL к определению столбца требует, чтобы столбец не содержал NULL значений.
CREATE TABLE students (name VARCHAR NOT NULL); INSERT INTO students VALUES (NULL);
Constraint Error: NOT NULL constraint failed: students.name
Первичный ключ и ограничение уникальности
Ограничения первичного ключа или уникальности определяют столбец или набор столбцов, являющиеся уникальным идентификатором строки в таблице. Ограничение обеспечивает, что указанные столбцы являются уникальными в пределах таблицы, т.е. что не более одной строки содержит заданные значения для набора столбцов.
CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR); INSERT INTO students VALUES (1, 'Student 1'); INSERT INTO students VALUES (1, 'Student 2');
Constraint Error: Duplicate key "id: 1" violates primary key constraint
CREATE TABLE students (id INTEGER, name VARCHAR, PRIMARY KEY (id, name)); INSERT INTO students VALUES (1, 'Student 1'); INSERT INTO students VALUES (1, 'Student 2'); INSERT INTO students VALUES (1, 'Student 1');
Constraint Error: Duplicate key "id: 1, name: Student 1" violates primary key constraint
Для эффективной реализации этого свойства для каждого ограничения первичного ключа или уникальности, определенного в таблице, автоматически создается индекс ART.
Ограничения первичного ключа и уникальности идентичны за двумя исключениями:
- В таблице может быть определено только одно ограничение первичного ключа, но несколько ограничений уникальности
- Ограничение первичного ключа также требует, чтобы ключи не были
NULL.
CREATE TABLE students(id INTEGER PRIMARY KEY, name VARCHAR, email VARCHAR UNIQUE); INSERT INTO students VALUES (1, 'Student 1', 'student1@uni.com'); INSERT INTO students values (2, 'Student 2', 'student1@uni.com');
Constraint Error: Duplicate key "email: student1@uni.com" violates unique constraint.
INSERT INTO students(id, name) VALUES (3, 'Student 3');
INSERT INTO students(name, email) VALUES ('Student 3', 'student3@uni.com'); Constraint Error: NOT NULL constraint failed: students.id
Предупреждение Индексы имеют определенные ограничения, которые могут привести к слишком ранней проверке ограничений, что может привести к ошибкам ограничений, таким как
violates primary key constraintиviolates unique constraint. Подробности см. в разделе индексов.
Внешние ключи
Внешние ключи определяют столбец или набор столбцов, которые ссылаются на первичный ключ или ограничение уникальности из другой таблицы. Ограничение требует, чтобы ключ существовал в другой таблице.
CREATE TABLE students (id INTEGER PRIMARY KEY, name VARCHAR); CREATE TABLE exams (exam_id INTEGER REFERENCES students(id), grade INTEGER); INSERT INTO students VALUES (1, 'Student 1'); INSERT INTO exams VALUES (1, 10); INSERT INTO exams VALUES (2, 10);
Constraint Error: Violates foreign key constraint because key "id: 2" does not exist in the referenced table
Для эффективной реализации этого свойства для каждого ограничения внешнего ключа, определенного в таблице, автоматически создается индекс ART.
Предупреждение Индексы имеют определенные ограничения, которые могут привести к слишком ранней проверке ограничений, что может привести к ошибкам ограничений, таким как
violates primary key constraintиviolates unique constraint. Подробности см. в разделе индексов.
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/constraints.html