⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
约束

在 SQL 中,可以为表指定约束。约束强制对插入到表中的数据施加特定属性。约束可以与表的模式一起,作为 CREATE TABLE 语句的一部分进行指定。在某些情况下,也可以使用 ALTER TABLE 语句向表中添加约束,但目前并非所有约束都支持此操作。

警告 约束对性能有很大影响:它们会减慢加载和更新的速度,但会加速某些查询。详情请参阅性能指南

语法

检查约束

检查约束允许您指定任意布尔表达式。任何**不**满足此表达式的列都将违反此约束。例如,我们可以使用以下 CHECK 约束来强制 name 列不包含空格。

CREATE TABLE students (name VARCHAR CHECK (NOT contains(name, ' ')));
INSERT INTO students VALUES ('this name contains spaces');
Constraint Error:
CHECK constraint failed on table students with expression CHECK((NOT contains("name", ' ')))

非空约束

非空约束指定列不能包含任何 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 constraintviolates 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 constraintviolates unique constraint 等约束错误。详情请参阅索引部分