概述
约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型。这确保了数据库中数据的准确性和可靠性。
约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。
以下是在 SQLite 中常用的约束。
NOT NULL 约束:确保某列不能有 NULL 值。
DEFAULT 约束:当某列没有指定值时,为该列提供默认值。
UNIQUE 约束:确保某列中的所有值是不同的。
PRIMARY Key 约束:唯一标识数据库表中的各行/记录。
CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。
NOT NULL 约束
确保某列不能有 NULL 值。
sqlite> CREATE TABLE student(id integer NOT NULL,name char,sex char,score real);
sqlite> insert into student(name,sex,score) values('zhangsan','m',98);
Error: NOT NULL constraint failed: student.id
sqlite> insert into student(id,name,sex,score) values(1,'zhangsan','m',98);
sqlite> select * from student;
id name sex score
---------- ---------- ---------- ----------
1 zhangsan m 98.0
sqlite>
我们设置约束id为非空值,在插入一条记录时,空值会出现错误。
DEFAULT 约束
当某列没有指定值时,为该列提供默认值。
sqlite> drop table student;
sqlite> CREATE TABLE student(id integer,name char,sex char default 'm',score real);
sqlite> insert into student(id,name,score) values(1,'zhangsan',98);
sqlite> select * from student;
id name sex score
---------- ---------- ---------- ----------
1 zhangsan m 98.0
sqlite>
UNIQUE 约束
确保某列中的所有值是不同的。例如在登录用户名上,我们不允许出现相同的用户名,就可以设置用户名为UNIQUE
sqlite> drop table student;
Error: no such table: student
sqlite> CREATE TABLE student(id integer,name char unique,sex char,score real);
sqlite> insert into student(id,name,sex,score) values(1,'zhangsan','w',98);
sqlite> insert into student(id,name,sex,score) values(2,'zhangsan','m',94);
Error: UNIQUE constraint failed: student.name
sqlite> insert into student(id,name,sex,score) values(2,'lisi','m',94);
sqlite> select *from student;
id name sex score
---------- ---------- ---------- ----------
1 zhangsan w 98.0
2 lisi m 94.0
sqlite>
PRIMARY Key 约束:
唯一标识数据库表中的各行/记录。
PRIMARY KEY 约束唯一标识数据库表中的每个记录。在一个表中可以有多个 UNIQUE 列,但只能有一个主键。在设计数据库表时,主键是很重要的。主键是唯一的 ID。
我们使用主键来引用表中的行。可通过把主键设置为其他表的外键,来创建表之间的关系。由于"长期存在编码监督",在 SQLite 中,主键可以是 NULL,这是与其他数据库不同的地方。
主键是表中的一个字段,唯一标识数据库表中的各行/记录。主键必须包含唯一值。主键列不能有 NULL 值。
一个表只能有一个主键,它可以由一个或多个字段组成。当多个字段作为主键,它们被称为复合键。
如果一个表在任何字段上定义了一个主键,那么在这些字段上不能有两个记录具有相同的值。
primay key 常和autoincrement一起使用
sqlite> CREATE TABLE student(id integer primary key autoincrement not NULL,name char,sex char,score real);
sqlite> insert into student(name,sex,score) values('zhangsan','w',98);
sqlite> insert into student(name,sex,score) values('lisi','w',98);
sqlite> select * from student;
id name sex score
---------- ---------- ---------- ----------
1 zhangsan w 98.0
2 lisi w 98.0
sqlite>
CHECK 约束:
CHECK 约束确保某列中的所有值满足一定条件。
sqlite> drop table student;
sqlite> CREATE TABLE student(id integer primary key autoincrement not NULL,name char,sex char,score real CHECK(score > 0));
sqlite> insert into student(name,sex,score) values('lisi','w',-90);
Error: CHECK constraint failed: student
sqlite> insert into student(name,sex,score) values('lisi','w',90);
sqlite> select *from student;
id name sex score
---------- ---------- ---------- ----------
1 lisi w 90.0
sqlite>
详情参见:https://www.runoob.com/sqlite/sqlite-constraints.html