在SQL中,可以为表指定约束。约束强制执行插入表中的数据的某些属性。约束可以随表的结构一起指定,作为CREATE TABLE
语句的一部分。在某些情况下,也可以使用ALTER TABLE
语句向表添加约束,但目前并非所有约束都支持此操作。
警告:约束对性能有很大影响:它们会减慢加载和更新的速度,但会加快某些查询的速度。详情请参阅性能指南。
Syntax
检查约束
检查约束允许您指定任意的布尔表达式。任何不满足此表达式的列都会违反约束。例如,我们可以使用以下CHECK
约束来强制name
列不包含空格。
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
值。
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', '[email protected]');
INSERT INTO students values (2, 'Student 2', '[email protected]');
Constraint Error: Duplicate key "email: [email protected]" violates unique constraint.
INSERT INTO students(id, name) VALUES (3, 'Student 3');
INSERT INTO students(name, email) VALUES ('Student 3', '[email protected]');
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 subjects (id INTEGER PRIMARY KEY, name VARCHAR);
CREATE TABLE exams (
exam_id INTEGER PRIMARY KEY,
subject_id INTEGER REFERENCES subjects(id),
student_id INTEGER REFERENCES students(id),
grade INTEGER
);
INSERT INTO students VALUES (1, 'Student 1');
INSERT INTO subjects VALUES (1, 'CS 101');
INSERT INTO exams VALUES (1, 1, 1, 10);
INSERT INTO exams VALUES (2, 1, 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
。有关更多详细信息,请参阅 索引部分。