约束是按照约定(特定)条件限制,管束等意思。约束的作用是添加、删除。
在数据库中对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。
对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。
主键 primary key
唯一 unique
非空 not null
默认值 default
外键 foreign key
检查约束 check
格式1: 字段名 字段类型 primary key #在create table 语句中设置主键
格式2: alter table 数据库表名 add primary key(字段名); #在已经创建好的数据库表中增加主键
格式3: alter table 数据库表名 drop primary key; #在已经创建好的数据库表中删除主键
注意:
非空 not null
唯一
是每一条记录的唯一标识,不会重复。
如:
注意:
通常主键,单独给每张表设计一个 id 的字段,把 id 作为主键。
主键是给数据库和程序使用的,不是给最终的客户使用的。所以主键有没有含义没有关系,只要不重复,非空就行。
创建一个老师表,里面包含了字段名(tid,tname,sex,age),将tid做为主键
create table teacher( tid int primary key, -- sid为主键 tname varchar(20), sex varchar(2), age int );
mysql> create table teacher( tid int primary key, -- sid为主键 tname varchar(20), sex varchar(2), age int ); Query OK, 0 rows affected (0.10 秒) mysql> desc teacher; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | tid | int(11) | NO | PRI | NULL | | | tname | varchar(20) | YES | | NULL | | | sex | varchar(2) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 行于数据集 (0.01 秒)
往老师表中插入记录
#插入记录 mysql> insert into teacher values(1,'李小四','男',45); Query OK, 1 rows affected (0.08 秒) #插入相同记录 mysql> insert into teacher values(1,'李小四','男',45); Duplicate entry '1' for key 'PRIMARY' mysql> select * from teacher; +-----+-----------+------+------+ | tid | tname | sex | age | +-----+-----------+------+------+ | 1 | 李小四 | 男 | 45 | +-----+-----------+------+------+ 1 行于数据集 (0.01 秒) #插入一条null记录 mysql> insert into teacher values(null,'李小四','男',45); Column 'tid' cannot be null
去掉老师表中的主键约束
mysql> alter table teacher drop primary key; Query OK, 1 rows affected (0.07 秒) mysql> desc teacher; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | tid | int(11) | NO | | NULL | | | tname | varchar(20) | YES | | NULL | | | sex | varchar(2) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 行于数据集 (0.01 秒)
为老师表添加主键约束
mysql> alter table teacher add primary key(tid); Query OK, 0 rows affected (0.25 秒) mysql> desc teacher; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | tid | int(11) | NO | PRI | NULL | | | tname | varchar(20) | YES | | NULL | | | sex | varchar(2) | YES | | NULL | | | age | int(11) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 4 行于数据集 (0.02 秒)
在数据库表中,主键一般情况下,我们是用一个id字段来表示,如果让我们自己添加的话要做到不能重复、不能为空就比较麻烦,所以主键我们都是设置为自动增长。
格式: 字段名 字段类型 primary key auto_increment
案例:
创建一个用户表,表里面有用户名和密码
create table user( uid int primary key auto_increment, uname varchar(20), pword varchar(20) );
在用户表中插入二条件数据
mysql> insert into user(uname,pword)values('zutuanxue01','00001'); Query OK, 1 rows affected (0.06 秒) mysql> insert into user(uname,pword)values('zutuanxue02','00002'); Query OK, 1 rows affected (0.01 秒) mysql> select * from user; +-----+------------+-------+ | uid | uname | pword | +-----+------------+-------+ | 1 | zutuanxue01 | 00001 | | 2 | zutuanxue02 | 00002 | +-----+------------+-------+ 2 行于数据集 (0.01 秒)
注意:
设置表字段的自增长后,他的默认起始值从1开始
mysql> insert into user values(null,'zutuanxue03','00003'); Query OK, 1 rows affected (0.03 秒) mysql> select * from user; +-----+------------+-------+ | uid | uname | pword | +-----+------------+-------+ | 1 | zutuanxue01 | 00001 | | 2 | zutuanxue02 | 00002 | | 3 | zutuanxue03 | 00003 | +-----+------------+-------+ 3 行于数据集 (0.01 秒)
格式: alter table 数据库表名 auto_increment=起始值;
案例:
修改用户表中主键自增长的起始值为100
mysql> alter table user auto_increment=100; Query OK, 0 rows affected (0.05 秒) mysql> insert into user values(null,'zutuanxue04','00004'); Query OK, 1 rows affected (0.10 秒) mysql> select * from user; +-----+------------+-------+ | uid | uname | pword | +-----+------------+-------+ | 1 | zutuanxue01 | 00001 | | 2 | zutuanxue02 | 00002 | | 3 | zutuanxue03 | 00003 | | 100 | zutuanxue04 | 00004 | +-----+------------+-------+ 4 行于数据集 (0.01 秒)
格式: create table 数据库表名( 字段名1 字段类型 primary key auto_increment, 字段名2 字段类型, ... 字段名n 字段类型, )auto_increment=超始值;
创建一个新用户表,表里面有用户名和密码,并设置起始值为100
create table new_user( uid int primary key auto_increment, uname varchar(20), pword varchar(20) )auto_increment=100;
在新用户表中插入一条件数据
mysql> insert into new_user(uname,pword)values('zutuanxue01','00001'); Query OK, 1 rows affected (0.10 秒) mysql> select * from new_user; +-----+------------+-------+ | uid | uname | pword | +-----+------------+-------+ | 100 | zutuanxue01 | 00001 | +-----+------------+-------+ 1 行于数据集 (0.01 秒)
删除记录后,对自增长字段没有影响
案例:
删除用户数据库表中的所有记录,在插入1条记录
mysql> delete from user; Query OK, 4 rows affected (0.11 秒) mysql> insert into user values(null,'zhangsan','zhangsan'); Query OK, 1 rows affected (0.05 秒) mysql> select * from user; +-----+----------+----------+ | uid | uname | pword | +-----+----------+----------+ | 101 | zhangsan | zhangsan | +-----+----------+----------+ 1 行于数据集 (0.01 秒)
删除记录后,自增长字段重新从1开始
案例:
删除用户数据库表中的所有记录,在插入1条记录
mysql> truncate user; Query OK, 0 rows affected (0.02 秒) mysql> insert into user values(null,'zhangsan','zhangsan'); Query OK, 1 rows affected (0.05 秒) mysql> select * from user; +-----+----------+----------+ | uid | uname | pword | +-----+----------+----------+ | 1 | zhangsan | zhangsan | +-----+----------+----------+ 1 行于数据集 (0.01 秒)
mysql> truncate new_user; Query OK, 0 rows affected (0.06 秒) mysql> insert into new_user values(null,'zhangsan','zhangsan'); Query OK, 1 rows affected (0.04 秒) mysql> select * from new_user; +-----+----------+----------+ | uid | uname | pword | +-----+----------+----------+ | 1 | zhangsan | zhangsan | +-----+----------+----------+ 1 行于数据集 (0.01 秒)
唯一约束就是:设计表中的某一个字段不能出现重复的记录
字段名 字段类型 unique #在create table 语句中设置唯一约束
案例:
创建一个新的表t1,表里包含字段名(id,name)
create table t1( id int, name varchar(20) unique -- 姓名唯一,不能出现重复 );
往表中插入一条记录
mysql> insert into t1 values(1,'zhangsan'); Query OK, 1 rows affected (0.08 秒)
继续插入同一条件记录
mysql> insert into t1 values(1,'zhangsan'); Duplicate entry 'zhangsan' for key 'name'
案例:
mysql> insert into t1 values(1,null); Query OK, 1 rows affected (0.02 秒) mysql> insert into t1 values(1,null); Query OK, 1 rows affected (0.05 秒) mysql> select * from t1; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 1 | NULL | | 1 | NULL | +------+----------+ 3 行于数据集 (0.01 秒)
注意:
null表示的是没有数据,所有不存在重复的问题
非空约束就是:数据库表中的字段的值,不能为null
字段名 字段类型 not null #在create table 语句中设置字段值不能为null
案例:
创建一个新的表t2,表里包含字段名(id,name)
create table t2( id int, name varchar(20) not null -- 姓名的记录不能为null );
往表中插入一条记录
mysql> insert into t2 values(1,'lisi'); Query OK, 1 rows affected (0.10 秒)
往表中插入一条姓名为null的记录
mysql> insert into t2 values(1, null); Column 'name' cannot be null mysql> select * from t2; +------+------+ | id | name | +------+------+ | 1 | lisi | +------+------+ 1 行于数据集 (0.01 秒)
注意:
字段设置了非空与唯一约束与主键区别?
主键数在一个表中,只能有一个。自增长只能用在主键上
非空与唯一约束可以设置在N个字段上
默认值就是:当我们在增加记录的时候如果不去设置值,那么自动的会用默认值补齐,字段默认的默认值是null
字段名 字段类型 default 默认值 #在create table 语句中设置字段的默认值,不设置默认值为null
案例:
创建一个新的表t3,表里包含字段名(id,name)
create table t3( id int, name varchar(20) default 'lisi' -- 增加时如果不加入姓名,姓名为‘lisi’ );
往表中插入一条记录
mysql> insert into t3 values(1,'zhangsan'); Query OK, 1 rows affected (0.03 秒)
往表中插入一条id为1的记录,其他信息不用增加
方法一:
mysql> insert into t3(id) values(1); Query OK, 1 rows affected (0.06 秒) mysql> select * from t3; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 1 | lisi | +------+----------+ 2 行于数据集 (0.01 秒)
方法二:
mysql> insert into t3 values(1,default); Query OK, 1 rows affected (0.09 秒) mysql> select * from t3; +------+----------+ | id | name | +------+----------+ | 1 | zhangsan | | 1 | lisi | | 1 | lisi | +------+----------+ 3 行于数据集 (0.01 秒)
数据冗余是指数据之间的重复,也可以说是同一数据存储在不同数据文件中的现象。
员工表
除了数据冗余的问题外,假如我们的研发部搬到了北京,这这时候,我们就要去修改我们的研发部的地点,这样的修改数据的时候也会很麻烦。
问题解决
数据冗余、数据增、删、改?
新的问题?
假如我们在员工表中增加一条记录
员工表中的记录dep_id中的3,在部门表中并没有这个id的记录。我们也将这条记录加入了进去。那么我们的员工王六就没有对应的部门了。这种情况在实际的应用中是不允许的。
实际情况:
我们员工表中的dep_id的值,只能是部门表中存在的id。
解决方法:
使用外键约束
一张表的一个字段受限于另外一张表的一个字段对应的值。这里涉及到两张表:被引用的表叫主表(父表),另外一张叫从表(子表)。
**子表:**定义了外键的表,外键的取值要么取父表中字段对应的值,要么取NULL值,严重受限于父表
**父表:**被引用的字段要具有唯一性(绝大多数都是用的父表的主键)
格式一: [constraint][外键约束名称] foreign key(外键字段名) references 主表名称(主键字段名); #在create table时设置
案例:
创建一个班级表:
create table classes( -- 班级表 cid int primary key auto_increment,-- 班级ID cname varchar(20),-- 班级名称 crenshu int(3),-- 班级人数 cmajor varchar(10),-- 专业 cmark text -- 备注 ); mysql> desc classes; +---------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+----------------+ | cid | int(11) | NO | PRI | NULL | auto_increment | | cname | varchar(20) | YES | | NULL | | | crenshu | int(3) | YES | | NULL | | | cmajor | varchar(10) | YES | | NULL | | | cmark | text | YES | | NULL | | +---------+-------------+------+-----+---------+----------------+ 5 行于数据集 (0.01 秒)
插入班级信息:
mysql> insert into classes values(null,'一班',60,'计算机','学校的王牌专业'),(null,'二班',50,'财务会计','学校最好就业专业'); Query OK, 2 rows affected (0.06 秒) mysql> select * from classes; +-----+--------+---------+--------------+--------------------------+ | cid | cname | crenshu | cmajor | cmark | +-----+--------+---------+--------------+--------------------------+ | 3 | 一班 | 60 | 计算机 | 学校的王牌专业 | | 4 | 二班 | 50 | 财务会计 | 学校最好就业专业 | +-----+--------+---------+--------------+--------------------------+ 2 行于数据集 (0.01 秒)
创建一个学生表(与班级表建立主外键关联):
create table stu -- 学生表 ( sid int primary key auto_increment, -- 学生ID sname varchar(20),-- 学生姓名 ssex varchar(2),-- 性别 stell varchar(11),-- 电话号码 sdate date ,-- 入学日期 srmark varchar(30),-- 备注 sclassid int,-- 外键对应主表中的主建 -- 创建外键约束 constraint stu_sclassid_fk foreign key (sclassid) references classes(cid) ); mysql> desc stu; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | sid | int(11) | NO | PRI | NULL | auto_increment | | sname | varchar(20) | YES | | NULL | | | ssex | varchar(2) | YES | | NULL | | | stell | varchar(11) | YES | | NULL | | | sdate | date | YES | | NULL | | | srmark | varchar(30) | YES | | NULL | | | sclassid | int(11) | YES | MUL | NULL | | +----------+-------------+------+-----+---------+----------------+ 7 行于数据集 (0.01 秒)
注意:
PRI主键约束; UNI唯一约束; MUL可以重复。
插入学生信息:
mysql> insert into stu values(null,'张三','男','13111111111','2019-09-01','学习成绩不错',3); Query OK, 1 rows affected (0.03 秒) mysql> insert into stu values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',1); Cannot add or update a child row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`)) mysql> select * from stu; +-----+--------+------+-------------+------------+--------------------+----------+ | sid | sname | ssex | stell | sdate | srmark | sclassid | +-----+--------+------+-------------+------------+--------------------+----------+ | 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 | +-----+--------+------+-------------+------------+--------------------+----------+ 1 行于数据集 (0.02 秒)
格式二: alter table 从表名称 add [constraint][外键约束名称] foreign key(外键字段名) references 主表名称(主键字段名); #建好表后修改
案例:
创建一个学生表:
create table stu1 -- 学生表 ( sid int primary key auto_increment, -- 学生ID sname varchar(20),-- 学生姓名 ssex varchar(2),-- 性别 stell varchar(11),-- 电话号码 sdate date ,-- 入学日期 srmark varchar(30),-- 备注 sclassid int -- 外键对应主表中的主建 ); mysql> desc stu1; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | sid | int(11) | NO | PRI | NULL | auto_increment | | sname | varchar(20) | YES | | NULL | | | ssex | varchar(2) | YES | | NULL | | | stell | varchar(11) | YES | | NULL | | | sdate | date | YES | | NULL | | | srmark | varchar(30) | YES | | NULL | | | sclassid | int(11) | YES | | NULL | | +----------+-------------+------+-----+---------+----------------+ 7 行于数据集 (0.02 秒)
为我们的学生表stu1加入我们的外键约束
mysql> alter table stu1 add constraint stu_sclassid_fk1 foreign key (sclassid) references classes(cid); Query OK, 0 rows affected (0.05 秒) mysql> desc stu1; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | sid | int(11) | NO | PRI | NULL | auto_increment | | sname | varchar(20) | YES | | NULL | | | ssex | varchar(2) | YES | | NULL | | | stell | varchar(11) | YES | | NULL | | | sdate | date | YES | | NULL | | | srmark | varchar(30) | YES | | NULL | | | sclassid | int(11) | YES | MUL | NULL | | +----------+-------------+------+-----+---------+----------------+ 7 行于数据集 (0.02 秒)
插入学生信息:
mysql> insert into stu1 values(null,'张三','男','13111111111','2019-09-01','学习成绩不错',3); Query OK, 1 rows affected (0.07 秒) mysql> insert into stu1 values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',1); Cannot add or update a child row: a foreign key constraint fails (`zutuanxue`.`stu1`, CONSTRAINT `stu_sclassid_fk1` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`)) mysql> select * from stu1; +-----+--------+------+-------------+------------+--------------------+----------+ | sid | sname | ssex | stell | sdate | srmark | sclassid | +-----+--------+------+-------------+------------+--------------------+----------+ | 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 | +-----+--------+------+-------------+------------+--------------------+----------+ 1 行于数据集 (0.01 秒)
格式: alter table 从表 drop foreign key 外键约束名称;
案例:
删除stu1中的外表关联
mysql> alter table stu1 drop foreign key stu_sclassid_fk1; Query OK, 0 rows affected (0.05 秒) mysql> desc stu1; +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | sid | int(11) | NO | PRI | NULL | auto_increment | | sname | varchar(20) | YES | | NULL | | | ssex | varchar(2) | YES | | NULL | | | stell | varchar(11) | YES | | NULL | | | sdate | date | YES | | NULL | | | srmark | varchar(30) | YES | | NULL | | | sclassid | int(11) | YES | MUL | NULL | | +----------+-------------+------+-----+---------+----------------+ 7 行于数据集 (0.02 秒)
插入数据
mysql> insert into stu1 values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',1); Query OK, 1 rows affected (0.04 秒) mysql> select * from stu1; +-----+--------+------+-------------+------------+--------------------+----------+ | sid | sname | ssex | stell | sdate | srmark | sclassid | +-----+--------+------+-------------+------------+--------------------+----------+ | 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 | | 3 | 李四 | 男 | 13112211112 | 2019-09-01 | 学习成绩一般 | 1 | +-----+--------+------+-------------+------------+--------------------+----------+ 2 行于数据集 (0.01 秒)
当我们的主表班级表中的cid发生变化时,我们应该如何去改变我们的从表学生表中的sclassid?这个时候我们就需要级联。
mysql> delete from classes; Cannot delete or update a parent row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`)) mysql> delete from classes where cid=3; Cannot delete or update a parent row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`))
mysql> update classes set cid=1 where cid=3; Cannot delete or update a parent row: a foreign key constraint fails (`zutuanxue`.`stu`, CONSTRAINT `stu_sclassid_fk` FOREIGN KEY (`sclassid`) REFERENCES `classes` (`cid`))
在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作。
级联操作分为二种:级联更新、级联删除
格式: on update cascade #级联更新 on delete cascade #级联操作
只能是创建表的时候创建级联关系。更新主表中的主键,从表中的外键列也自动同步更新
案例:
创建一个学生表(与班级表建立主外键关联,并加入级联操作)
create table stu -- 学生表 ( sid int primary key auto_increment, -- 学生ID sname varchar(20),-- 学生姓名 ssex varchar(2),-- 性别 stell varchar(11),-- 电话号码 sdate date ,-- 入学日期 srmark varchar(30),-- 备注 sclassid int,-- 外键对应主表中的主建 -- 创建外键约束 constraint stu_sclassid_fk foreign key (sclassid) references classes(cid) on update cascade on delete cascade );
在学生表中插入数据
mysql> insert into stu values(null,'张三','男','13111111111','2019-09-01','学习成绩不错',3); Query OK, 1 rows affected (0.11 秒) mysql> insert into stu values(null,'李四','男','13112211112','2019-09-01','学习成绩一般',4); Query OK, 1 rows affected (0.08 秒) mysql> select * from stu; +-----+--------+------+-------------+------------+--------------------+----------+ | sid | sname | ssex | stell | sdate | srmark | sclassid | +-----+--------+------+-------------+------------+--------------------+----------+ | 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 3 | | 2 | 李四 | 男 | 13112211112 | 2019-09-01 | 学习成绩一般 | 4 | +-----+--------+------+-------------+------------+--------------------+----------+ 2 行于数据集 (0.01 秒)
修改我们班级表中的主键
mysql> select * from classes; +-----+--------+---------+--------------+--------------------------+ | cid | cname | crenshu | cmajor | cmark | +-----+--------+---------+--------------+--------------------------+ | 3 | 一班 | 60 | 计算机 | 学校的王牌专业 | | 4 | 二班 | 50 | 财务会计 | 学校最好就业专业 | +-----+--------+---------+--------------+--------------------------+ 2 行于数据集 (0.01 秒) mysql> update classes set cid=1 where cid=3; Query OK, 1 rows affected (0.06 秒) mysql> select * from classes; +-----+--------+---------+--------------+--------------------------+ | cid | cname | crenshu | cmajor | cmark | +-----+--------+---------+--------------+--------------------------+ | 1 | 一班 | 60 | 计算机 | 学校的王牌专业 | | 4 | 二班 | 50 | 财务会计 | 学校最好就业专业 | +-----+--------+---------+--------------+--------------------------+ 2 行于数据集 (0.01 秒) mysql> select * from stu; +-----+--------+------+-------------+------------+--------------------+----------+ | sid | sname | ssex | stell | sdate | srmark | sclassid | +-----+--------+------+-------------+------------+--------------------+----------+ | 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 1 | | 2 | 李四 | 男 | 13112211112 | 2019-09-01 | 学习成绩一般 | 4 | +-----+--------+------+-------------+------------+--------------------+----------+ 2 行于数据集 (0.01 秒)
删除我们班级表中的主键
mysql> delete from classes where cid=4; Query OK, 1 rows affected (0.01 秒) mysql> select * from classes; +-----+--------+---------+-----------+-----------------------+ | cid | cname | crenshu | cmajor | cmark | +-----+--------+---------+-----------+-----------------------+ | 1 | 一班 | 60 | 计算机 | 学校的王牌专业 | +-----+--------+---------+-----------+-----------------------+ 1 行于数据集 (0.01 秒) mysql> select * from stu; +-----+--------+------+-------------+------------+--------------------+----------+ | sid | sname | ssex | stell | sdate | srmark | sclassid | +-----+--------+------+-------------+------------+--------------------+----------+ | 1 | 张三 | 男 | 13111111111 | 2019-09-01 | 学习成绩不错 | 1 | +-----+--------+------+-------------+------------+--------------------+----------+ 1 行于数据集 (0.01 秒)
检查约束指定某列中的值必须满足布尔表达式,根据用户自己的需求来进行限制。
格式: create table 表名 ( check (字段名1 != 字段名1), 字段名1 字段类型 check (表达式), 字段名2 字段类型 constraint 唯一约束名 check (表达式) [not enforced] );
注意:
表达式中可以包含该字段名: 字段名 > 0
表达式注意事项
1.允许使用文字,内置函数和运算符
2.不允许在使用了auto_increment的列上使用
3.不允许存储函数和用户定义的函数
4.不允许子查询等
如果省略或指定为enforced,则创建并强制执行约束。
如果指定为not enforced,则创建约束但不强制执行。
案例:
创建一个表t4
create table t4 ( id int primary key auto_increment, username varchar(32), phone varchar(11) check(length(phone) =11) );
插入数据
mysql> insert into t4 values(null,'zhangsan','13812221222'); Query OK, 1 rows affected (0.01 秒) mysql> insert into t4 values(null,'zhangsan','1381222125'); Check constraint 't4_chk_1' is violated.
格式: create table 表名 ( 字段名1 字段类型, 字段名2 字段类型, [constraint 检查约束名] check(布尔表达式) [ not enforced] );
案例:
创建一个表t5
create table t5 ( id int primary key auto_increment, username varchar(32), phone varchar(11), constraint t5_check_phone check(length(phone) =11) );
插入数据
mysql> insert into t5 values(null,'zhangsan','13812222222'); Query OK, 1 rows affected (0.01 秒) mysql> insert into t5 values(null,'zhangsan','1381222222'); Check constraint 't4_check_phone' is violated.
格式: alter table 数据库表名 add constraint 检查约束名 check(检查约束);
案例:
创建一个表t6
create table t6 ( id int primary key auto_increment, username varchar(32), phone varchar(11) ); mysql> alter table t6 add constraint t6_check_phone check(length(phone)=11); Query OK, 0 rows affected (0.09 秒)
插入数据
mysql> insert into t6 values(null,'zhangsan','13812221222'); Query OK, 1 rows affected (0.01 秒) mysql> insert into t6 values(null,'zhangsan','1381222125'); Check constraint 't6_check_phone' is violated.
格式: alter table 数据库表名 drop check 检查约束名;
案例:
删除t6表中的检查约束t6_check_phone
mysql> alter table t6 drop check t6_check_phone; Query OK, 0 rows affected (0.02 秒)
插入数据
mysql> insert into t6 values(null,'zhangsan','1381222125'); Query OK, 1 rows affected (0.01 秒)