目录
一、约束的作用
约束是为了保证数据的完整性和精确性以及可靠性。
在
MySQL
中约束有以下几种:
(1)键约束:包括主键
(Primary Key)
约束、外键
(Foreign Key)
约束、唯一键
(Unique)
约束
(2)
非空约束:也就是
NOT NULL
约束
(3)
检查约束:也叫
Check
约束
(4)
缺省约束:也叫
Default
约束
1.1、查看某个表的约束
语法格式:
select * from information_schema.TABLE_CONSTRAINTS
where table_name='表名称';
例如:查看 t_stu
表的约束
select * from information_schema.TABLE_CONSTRAINTS
where table_name='t_stu';
二、主键约束
主键约束也是
Primary Key
约束,简称
PK
,它是数据库的主键,用于保证实体的完整性,可以是一个列,也可以是多个列的组合。
对于主键约束来说,它相当于唯一约束
+
非空约束的组合。对于主键约束的列,它是不允许数据重复,也不允许出现空值。
每个表有且最多只允许一个主键约束。
当我们在创建表时,如果指定了主键,也就指定了主键约束,同时在
MySQL
中,还会为主键约
束建立主键索引,当删除主键时,同时也会删除主键约束和索引。
2.1、创建主键约束
(1)在创建表中主键后直接加主键约束
create table t_teacher (
tid int(11) primary key, -- 主键约束
tname varchar(20),
gender char
);
注意:这种方式不能添加复合主键约束。
(2)在创建表中的最后来单独声明
create table t_course(
cid int(11),
name varchar(100),
description varchar(200),
primary key(cid) -- 添加主键约束
);
这各种方式可以用于添加复合主键约束,如果要添加复合主键约束,只需要把字段名写在括号中,用英文逗号分隔即可。
(3)
创建好表后再添加约束
语法格式:
alter table 表名 add [constraint 约束名称] primary key(字段名1,字段名2,...);
示例:
create table t_xx (
id int(11),
name varchar(20)
)
alter table t_xx add constraint t_xx_pk primary key(id);
2.2、删除主键约束
删除主键约束时,不需要指定主键名称,因为一张中最多只有一个主键约束。
语法格式:
alter table 表名 drop primary key;
三、唯一约束
唯一约束(
Unique Key
),简称
UK
。
同一张表可以有多个唯一约束,唯一约束可以使是某一个列的值唯一,也可以让多个列组合为唯一约束后从而实现值的唯一。
3.1、创建唯一约束
(1)在创建表时,指定表主键
(2)在创建表中来指定唯一约束
添加唯一约束的语法是:
constraint 唯一约束名称 unique key(字段名列表)
create table t_per(
id int primary key,
name varchar(100),
tel varchar(11),
constraint uk_t_per_tel unique key (tel)
);
(3)在表创建好后再指定
语法格式:
alter table 表名 add constraint 唯一约束名称 unique key(字段名列表);
这种方式是要先创建表,然后再添加约束。
3.2、删除唯一约束
语法格式:
alter table 表名 drop index 唯一约束名;
3.3、主键约束和唯一约束区别
(1)
主键约束是非空,唯一约束允许为空;
(2)
主键约束一个表只能有一个,唯一约束一个表可以有多个。
四、外键约束
外键约束
Foreign Key
,简称
FK
。
外键约束是为了保证一个或两张表之间的参照完整性,它是用于构建表与表之间的关系。
当我们在创建外键约束时,数据默认会在这个列上建立对应的普通索引。当删除外键时,外键上的普通索引也会删除。
对于外键的使用要注意以下几点
:
(1)在从表上建立外键,而且主表要先存在;
(2)从表的外键列,在主表中引用的只能是键列(主键、唯一键、外键);
(3)一个表可以建立多个外键约束;
(4)从表的外键值必须在主表中能找到或者为空,从而约束了从表的外键列的值的添加和修改;
4.1、添加外键约束
示例:
create table t_a(
aid int primary key auto_increment,
aname varchar(20)
);
create table t_b(
bid int primary key auto_increment,
bname varchar(20),
a_id int(11), -- 外键
-- 添加外键
constraint fk_t_a_aid
foreign key(a_id) references t_a(aid) on update cascade on delete restrict
);
说明:
(1)使用 constraint 外键名列 foreign key(外键字段) references 引用表(字段) 的语法格式来创建外键。
(2)constraint 外键名列 这个部分是可以省略。
(3)on update cascade on delete restrict 表示做级联操。
4.2、建表后再创建外键约束
语法格式:
alter table 表名 add [constraint 约束名]
foreign key(从表字段) references 主 表名(主表中被参照的字段名);
例如:
alter table t_b add constraint fk_t_a_aid
foreign key(a_id) references t_a(aid);
4.3、删除外键约束
语法格式:
alter table 表名 drop foreign key 外键约束名;
例如:
alter table t_b drop foreign key fk_t_a_aid;
五、非空约束
5.1、创建表时指定
非空约束也就是
NOT NULL
约束,它是规定某个字段不能为空值。
create table t_user(
uid int primary key,
uname varchar(50),
tel varchar(11) not null
);
此时,
tel
这个字段就建立了非空约束。
5.2、创建表后指定
创建表后指定非空约束也是使用
alter
语法来指定。
语法格式:
alter table 表名 modify 字段名 数据类型(长度) not null;
示例:
alter table t_per modify name varchar(100) not null ;
六、检索约束
在
MySQL
中是不支持检查约束,但是可以使用
check
约束来进行指定,只是没有什么效果。
例如:
age tintint check(age > 18)
或者我们实现
gender char(1) check(gender in ('
男
','
女
'))
create table t_yy(
id int primary key,
name varchar(20),
gender char not null check(gender in ('男','女'))
);
插入数据
insert into t_yy values (1, 'sz', '男');
insert into t_yy values (2, 'sz', '人');
从上面的执行结果可以看出,check 约束MySQL是支持的,但是没有效果。
七、缺省约束(default 约束)
缺省约束也是
default
约束,它是默认值,在插入数据时,如果某列没有给定值,那么就会将默认值添加到新记录中。
create table t_zz(
id int primary key,
age int(2) not null default 0
);
在上例中,我们给
age
字段指定了默认值,它就是缺省约束。