约束:
在表上强制执行的数据校验规则,保证数据库里数据的完整性。当表中数据相互依赖时,保证相关数据不被删除。
也是数据库对象,也有自己的名字。
约束通常无法修改。
大部分数据库支持一下5种约束:
- NOT NULL:非空约束,指定某列不能为空;
- UNIQUE:唯一约束,指定某列或几列组合的数据不能重复;
- PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录;
- FOREIGN KEY:外键,指定改行记录从属于主表中的一条记录,主要用于保证参照完整性;
- CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。
MySQL不支持CHECK约束(可以使用,但没有任何作用)。
约束分类:
①单列约束;②多列约束(可约束多个数据列)。
约束时机:
- 建表同时为相应数据列指定约束;
- 建表后创建,以修改表的方式增加约束。
列级约束语法、表级约束语法。
Note:
MySQL使用information_schema数据库的TABLE_CONSTRAINTS表保存该数据库实例的所有约束信息,可通过该表查询。
SQL中的null:
不区分大小写;所有类型均可以为null(包括int、boolean);空字符串和0不等于null。
1、NOT NULL:列级
有not null当然也有null。
①建表指定:
CREATE TABLE person (
id INT NOT NULL,
age VARCHAR(2)NULL
)
②alter修改表时增删:
ALTER TABLE person
#增加非空约束
MODIFY username VARCHAR(10)NO
TNULL,
#取消非空约束
MODIFY age INT NULL,
#取消非空约束,并指定默认值
MODIFY grade INT DEFAULT 99 NULL;
2、UNIQUE:列级、表级
列不可以出现重复值,null除外(数据库中null不等于null)。
单列:使用列级约束语法【第一约束名即为字段名,其他加序号,如id_2】
CREATE TABLE unique_test (id INT UNIQUE);
多列、自行指定约束名:使用表级约束语法【格式:constraint 约束名 约束定义】
①建表时-分别建立唯一约束:
CREATE TABLE unique_test (
#非空约束
id INT NOT NULL,
uname VARCHAR(25),
pwd VARCHAR(25),
#表级约束语法建立唯一约束
UNIQUE(uname),
#表级约束语法建立唯一约束,并指定约束名uni
CONSTRAINT uni UNIQUE(pwd)
);
②建表时-列组合建立唯一约束:
CREATE TABLE unique_test (
#非空约束
id INTNOTNULL,
uname VARCHAR(25),
pwd VARCHAR(25),
#表级约束语法建立唯一约束,指定3列组合【不允许同时重复】
CONSTRAINT uni UNIQUE(id, uname, pwd)
);
③修改表时,add【表级约束语法】
ALTER TABLE unique_test
ADD UNIQUE(id, uname, pwd);
④修改表时,modify【只能对单列采用列级约束】
ALTER TABLE unique_test
MODIFY id INT UNIQUE;
⑤删除约束
大部分数据库使用“drop constraint 约束名”,MySql使用“drop index 约束名”。
ALTER TABLE unique_test
DROP INDEX id;
3、PRIMARY KEY:列级、表级
- 主键约束等价于非空约束+唯一约束(不允许重复和null值)。
- 主键列的值可用于唯一标识表中的一条记录。
- 每个表最多一个主键,但主键约束可由多个数据列组合而成。
- 大部分数据库允许定义主键约束的名字,MySql出于保持与标准SQL的兼容性,允许命名,但这个名字没有任何作用,主键名依旧是PRIMARY。
主键约束与唯一约束语法非常相似,只是使用primary key。
①建表时-列级约束语法:
CREATE TABLE unique_test (id INT PRIMARY KEY);
②建表时-表级约束语法:
CREATE TABLE unique_test (
id INT,
uname VARCHAR(25),
#指定主键名对MySql无效,依旧是primary
CONSTRAINT myPrimary PRIMARY KEY(id),
#多列组合主键约束
#CONSTRAINT myPrimary PRIMARY KEY(id, uname)
);
②删除主键约束
ALTER TABLE unique_test DROP PRIMARY KEY;
③修改表时,add【表级约束语法】
ALTER TABLE unique_test
ADD PRIMARY KEY(id, uname, pwd);
④修改表时,modify【只能对单列采用列级约束】
ALTER TABLE unique_test
MODIFY id INT PRIMARY KEY;
自增长【整型】:auto_increment
CREATETABLE auto_inc_test (
id intauto_incrementPRIMARYKEY,
uname VARCHAR(25)
);
4、FOREIGN KEY:列级、表级
- 外键约束:保证一个或两个数据表之间的参照完整性,构建于一个表的两个字段或两个表的两个字段间的参照关系;
- 外键确保两相关字段的参照关系:子(从)表外键列的值必须在被参照列的值范围内,或为空(可自行增加非空约束);
- 删除:欲删除(被从表记录参照的)主表记录,必须先删除从表里参照该记录的所有记录;或删主表记录时级联删除从表中所有参照该记录的从表记录;
- 外键只能参照主表主键列或唯一键列;
- 一个表可有多个外键;
- MySql也会为外键约束列建立索引;
- 用于实体间一对多<多的一端增加外键列>、一对一<任一方增加外键列,再增加唯一约束>的关联关系(多对多需额外增加一个连接表记录其关系);
①列级约束语法:REFERENCES 【出于保持与标准SQL的兼容性,实际无效,只能使用表级约束语法】
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
PRIMARY KEY(id)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INTREFERENCES teacher_table (id)
);
②表级约束语法:
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR (25),
PRIMARY KEY (id)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INT,
#constraint指定外键约束名
CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher)REFERENCES teacher_table (id)
);
MySql外键约束名默认为:table_name_ibfk_n,table_name是从表表名,n是从1开始的正数。
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
#必须以列组合建立主键
PRIMARYKEY(id, uname)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
java_teacher INT,
#CONSTRAINT指定外键约束名
CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher, stu_name)REFERENCES teacher_table (id, uname)
);
③删除外键约束:DROP
ALTER TABLE student_table
DROP FOREIGN KEY stu_tea_fk;
#stu_tea_fk为外键名
④增加外键约束:ADD FOREIGN KEY
ALTER TABLE student_table
ADD FOREIGN KEY(stu_id, stu_name)
REFERENCES teacher_table (id, uname);
⑤自关联:参照自身
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARYKEY,
stu_name VARCHAR(25),
refer_id INT,
CONSTRAINT stu_tea_fk FOREIGNKEY(refer_id)REFERENCES student_table (stu_id)
);
⑥级联删除:
ON DELETE CASCADE:删除主表时,从表记录全部级联删除;
ON DELETE SET NULL:删除主表时,参照该主表记录的外键设为null。
#为保证从表参照的主表存在,应先建主表
CREATE TABLE teacher_table (
id INT auto_increment,
uname VARCHAR(25),
#必须以列组合建立主键
PRIMARY KEY(id, uname)
);
CREATE TABLE student_table (
stu_id INT auto_increment PRIMARY KEY,
stu_name VARCHAR(25),
#CONSTRAINT指定外键约束名
#定义级联删除
#亦可onDELETESETNULL
CONSTRAINT stu_tea_fk FOREIGNKEY(stu_id)REFERENCES teacher_table (id)ONDELETECASCADE
);
5、CHECK【MySql无效】
CREATE TABLE check_test (
id INT auto_increment,
uname VARCHAR(25),
PRIMARY KEY(id),
CHECK(id >10)
# 要求id>10
);
可借助MySql的触发机制来实现CHENCK约束,甚至更复杂的完整性约束。