关于约束
数据完整性是指数据的精确性和可靠性。防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或无效信息。
SQL规范以约束的方式对表数据进行额外的条件限制。
约束是表级的强制规定。可以在创建表时规定约束,或者在表创建之后通过对表的修改来规定约束。约束即对表中字段的限制。
约束的分类:
角度一:约束的字段的个数
角度二:约束的作用范围
角度三:约束的作用
添加约束操作可以在创建表语句(CREATE TABLE)、修改表语句(ALTER TABLE)中。
删除约束操作在修改表语句(ALTER TABLE)中。
查看表约束:
非空约束
作用:
限制某个字段/某个列的值不允许为空(NULL)
关键字:NOT NULL
注:
在创建表语句(CREATE TABLE)添加约束:
例:
CREATE TABLE test_1(
id INT NOT NULL,
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25),
sal DECIMAL(10,2)
);
注:
在修改表语句(ALTER TABLE)中添加约束:
例:在MODIFY语句后写NOT NULL关键字即可
ALTER TABLE test_1
MODIFY email VARCHAR(25) NOT NULL;
在修改表语句(ALTER TABLE)中删除约束:
例:在MODIFY语句后不写NOT NULL关键字即可
ALTER TABLE test_1
MODIFY email VARCHAR(25);
唯一性约束:
用来约束某个字段/某列的值不能重复。(但是允许出现多个空值)
关键字:UNIQUE
特点:
添加唯一性约束:
建表时:
CREATE TABLE test_2(
id INT UNIQUE NOT NULL,-- 列级约束
last_name VARCHAR(15) NOT NULL,
email VARCHAR(25) UNIQUE,-- 列级约束
sal DECIMAL(10,2),
phone_num VARCHAR(15),
UNIQUE(phone_num)-- 表级约束
);
改表时(ALTER TABLE):
方式一:使用ADD UNIQUE(key)的方式。
例:
ALTER test_2
AND UNIQUE(sal);
方式二:使用MODIFY的方式。
例:
ALTER TABLE test_2
MODIFY last_name VARCHAR(15) UNIQUE;
复合的唯一性约束:(多列约束)
例:
CREATE TABLE test_user(
id INT,
`name` VARCHAR(15),
`password` VARCHAR(25),
#表级约束
UNIQUE(`name`,`password`)
);
此时以name和password作为唯一性的整体,即两个记录的name和password都相同时,才违背唯一性。
删除唯一性约束:
例:
ALTER TABLE test_2
DROP INDEX last_name;
ALTER TABLE test_2
DROP INDEX sal;
关于自定义约束名:
在UNIQUE前加上CONSTRAINT 约束名 ,即可。
例:
CREATE TABLE test_4(
email VARCHAR(25) CONSTRAINT ema UNIQUE,-- 列级约束
phone_num VARCHAR(15),
CONSTRAINT pho_num UNIQUE(phone_num)-- 表级约束
);
主键约束:
主键约束用来唯一标识表中的一行记录。
关键字:PRIMARY KEY
特点:
添加主键约束
建表时指定主键约束:
例:
CREATE TABLE test_pri(
id INT PRIMARY KEY,-- 列级约束
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);
CREATE TABLE test_pri_1(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25),
PRIMARY KEY(id,email)-- 表级约束
);
修改表时添加约束:
ALTER TABLE test_pri_2
ADD PRIMARY KEY(id);
删除主键约束:(最好不要删除表中的主键)
ALTER TABLE test_pri_2
DROP PRIMARY KEY;
自增列:AUTO_INCREMENT
作用:某个字段的值自增
关键字:AUTO_INCREMENT
特点:
在创建表时加上AUTO_INCREMENT:
CREATE TABLE test_pri_3(
id INT PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(15),
salary DECIMAL(10,2),
email VARCHAR(25)
);
在修改表时加上AUTO_INCREMENT:
ALTER TABLE test_pri_4
MODIFY id INT AUTO_INCREMENT;
删除AUTO_INCREMENT:
ALTER TABLE test_pri_4
MODIFY id INT; -- 不写AUTOINCREMENT即可
注:MySQL8.0后将主键的计数器持久化到重做日志中。即,删除了自增列的某个记录(若此自增列的值为a),即使重启了数据库,下一次添加记录时,新的自增列的值还是a + 1。
外键约束:
作用:限定某个表的某个字段的引用完整性。
关键字:FOREIGN KEY
关于主表和从表(父表和子表):
主表(父表):被引用的表
从表(子表):引用其他表的表
特点:
在创建表时添加外键
先创建主表:
CREATE TABLE test_dept(
dept_id INT PRIMARY KEY,
dept_name VARCHAR(15)
);
再创建从表:
CREATE TABLE test_emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
dept_id INT,
CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES test_dept(dept_id)
);
建立外键约束使用CONSTRAINT 外键约束名 FOREIGN KEY(从表的外键列) REFERENCES 主表(主表的被引用的列)
修改表时添加外键:
ALTER TABLE test_emp
ADD CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES test_dept(dept_id);
即在ADD语句后添加CONSTRAINT 外键约束名 FOREIGN KEY(从表的外键列) REFERENCES 主表(主表的被引用的列)
约束等级:
如果没有指定等级,就相当于RESTRICT方式。
指定等级在CONSTRAINT 外键约束名 FOREIGN KEY(从表的外键列) REFERENCES 主表(主表的被引用的列)
的语句后加上ON UPDATE 约束等级 ON DELETE 约束等级 即可。
例:
CREATE TABLE test_emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(15),
dept_id INT,
CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES test_dept(dept_id) ON UPDATE CASCADE ON DELETE SET NULL
);
对于外键约束,最好使用ON UPDATE CASCADE ON DELETE RESTRICT的方式。
删除外键约束:
第一步可以使用以下操作来查看某个表的外键约束的外键约束名,再删除外键约束:
删除:
第二步查看索引名,再删除索引。(只能手动删除)
检查约束:
作用:检查某个字段的值是否符合一定要求,一般指的是值的范围。(MySQL8.0及以上支持,在5.7中不起作用)
关键字:CHECK
建表时使用:
在字段后加上CHECK(条件)
当添加记录时,相应的字段的值需要满足CHECK括号后面的条件才能添加成功,否则报错,添加失败。
例:若员工工资不得低于2000
CREATE TABLE test_check(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) CHECK(salary > 2000)
);
默认值约束:
作用:给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,就赋值为默认值。
关键字:DEFAULT
建表时添加默认值:
在字段后加上DEFAULT 默认值
例:
CREATE TABLE test_check(
id INT,
last_name VARCHAR(15),
salary DECIMAL(10,2) DEFAULT 2000
);
在修改表时添加约束:
例:
ALTER TABLE test_default
MODIFY last_name VARCHAR(15) DEFAULT 'unknow';
删除默认值约束:
在修改表时的MODIFY语句中不写DEFAULT即可。