constraint
- 约束:数据完整性指的是数据的精确性和可靠性。
为了保证数据的完整性,对表数据进行额外的条件限制
- 实体完整性
- 域完整性
- 引用完整性
- 用户自定义完整性
约束:表级的强制规定
- 在创建表示规定约束
约束
什么是约束?
- 对表中字段的限制
约束的分类:
- 角度1:约束的字段的个数
- 单列约束
- 多列约束
- 角度2:约束的作用范围
- 列级约束:将此约束声明在对应字段的后面
- 表级约束:在表中所有字段都声明完后,在所有字段的后面声明的约束
- 角度3:约束的作用
- not null(非空约束)
- unique(唯一性约束)
- primary key(主键约束)
- foreign key(外键约束)
- check(检查约束)
- default(默认值约束)
如何添加约束
CREATE TABLE 时添加约束ALTER TABLE 时添加、删除约束
如何查看表中约束
SELECT * FROM information_schema.table_constraintsWHERE table_name = '表名称';
非空约束(not null)
- 限定某个字段的值是否允许为空
- 关键字:NOT NULL
在CREATE TABLE时添加约束
CREATE TABLE test1(id INT NOT NULL,last_name VARCHAR(15) NOT NULL,email VARCHAR(15),salary DECIMAL(10,2))DESC test1
INSERT INTO test1(id,last_name,email,salary)VALUES(1,'Tom','tom@126.com',3400)# 错误:Column 'last_name' cannot be nullINSERT INTO test1(id,last_name,email,salary)VALUES(2,NULL,'tom@126.com',3400)
在ALTER TABLE时添加约束
ALTER TABLE test1MODIFY email VARCHAR(25) NOT NULL
在ALTER TABLE时删除约束
ALTER TABLE test1MODIFY email VARCHAR(25) NULL
唯一性约束(unique)
- 用来限制某个字段/某列的值不能重复
- 关键字:UNIQUE
在 create table时添加约束
CREATE TABLE test2(id INT UNIQUE, # 列级约束last_name VARCHAR(15),email VARCHAR(25),salary DECIMAL(10,2),# 表级约束CONSTRAINT uk_test2_email UNIQUE(email));DESC test2
在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同
可以向声明为unique的字段上添加null值。而且可以多次添加null
在 alter table时添加约束
方式1:
ALTER TABLE test2ADD CONSTRAINT uk_test_sal UNIQUE(salary);
方式2:
ALTER TABLE test2MODIFY last_name VARCHAR(15) UNIQUE;
复合的唯一性约束
CREATE TABLE USER(id INT,`name` VARCHAR(15),`password` VARCHAR(25),#表级约束CONSTRAINT uk_user_name_pwd UNIQUE(`name`,`password`));
INSERT INTO USERVALUES(1,'Tom','abc');#可以添加成功INSERT INTO USERVALUES(1,'Tom1','abc');
复合的唯一性约束的案例
#学生表create table student(sid int, #学号sname varchar(20), #姓名tel char(11) unique key, #电话cardid char(18) unique key #身份证号);#课程表create table course(cid int, #课程编号cname varchar(20) #课程名称);#选课表create table student_course(id int,sid int, #学号cid int, #课程编号score int,unique key(sid,cid) #复合唯一);
删除唯一性约束
添加唯一性约束的列上也会自动创建唯一索引
- 删除唯一约束只能通过删除唯一索引的方式删除
- 删除时需要指定唯一索引名
- 如果创建唯一约束时未指定名称,如果时单列,就默认和列名相同;如果时组合列,那么默认和()中排第一个列名的相同
ALTER TABLE USERDROP INDEX uk_name_pwd;
主键约束(primary key)
- 用来唯一表示表中的一行记录
- 关键字:primary key
- 主键约束列不允许重复,也不允许出现空值
一个表中最多只能有一个主键约束
主键约束特征:
- 非空且唯一,用于唯一的标识表中的一条记录
在create table时添加约束
CREATE TABLE test3(id INT PRIMARY KEY, #列级约束last_name VARCHAR(15),salary DECIMAL(10,2),email VARCHAR(25));
CREATE TABLE test3(id INT,last_name VARCHAR(15),salary DECIMAL(10,2),email VARCHAR(25),#表级约束CONSTRAINT pk_test5_id PRIMARY KEY(id) #没有必要起名字);
MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用
如果时多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复
CREATE TABLE user1(id INT,`name` VARCHAR(15),`password` VARCHAR(25),PRIMARY KEY(`name`,`password`));
在alter table中添加主键约束
CREATE TABLE test6(id INT,last_name VARCHAR(15),salary DECIMAL(10,2),email VARCHAR(25));DESC test6;ALTER TABLE test6ADD PRIMARY KEY (id);
删除主键约束
- 在实际开发中,不会删除主键约束
ALTER TABLE test6DROP PRIMARY KEY;
自增列(auto_increment)
- 某个字段的值自增
- 关键字:auto_increment
在create table时添加
CREATE TABLE test7(id INT PRIMARY KEY,last_name VARCHAR(15) UNIQUE AUTO_INCREMENT);
- 当我们向主键(含auto_increment)的字段上添加0或Null时,实际上会自动的网上添加指定的字段的数值
- 一旦主键作用的字段上声明有auto_increment,则我们在添加数据时,就不要给主键对应的字段去赋值了
在alter table时添加
CREATE TABLE test8(id INT PRIMARY KEY,last_name VARCHAR(15));ALTER TABLE test8MODIFY id INT AUTO_INCREMENT;
在alter table时删除
ALTER TABLE test8MODIFY id INT;
自增变量的持久化
外键约束(foreign key)
- 限定某个表的某个字段的引用完整性
- 例如:员工表的员工所在的部门,必须在部门表中能找到
CHECK约束
- 用来检查某个字段的值是否符合xx要求,一般是指值的范围
- 关键字:check
- mysql5.7不支持check约束。
CREATE TABLE test10(id INT,last_name VARCHAR(15),salary DECIMAL(10,2) CHECK(salary > 2000));
INSERT INTO test10 //成功VALUES(1,'Tom',2500)
DEFAULT约束
- 当没有赋值时,设置默认值
CREATE TABLE test10(id INT,last_name VARCHAR(15),salary DECIMAL(10,2) DEFAULT 2000);
面试
- 为什么建表时加
