一、主键约束:PRIMARY KEY
1、特点:
(1)一个表有且只有一个主键约束
(2)主键约束 唯一并且非空
(3)主键约束的关键词为primary key
(4)创建主键会自动创建对应的索引,同样删除主键对应的索引也会删除
2、在建表的时候指定主键约束
create table 表名称(
字段名1 数据类型 primary key,
字段名2 数据类型,
…
);
例如:
create table t_stu(
sid int primary key,
sname varchar(20),
gender char
);
insert into t_stu values(1,‘张三’,‘男’),(1,‘李四’,‘女’);
insert into t_stu values(1,‘张三’,‘男’),(2,‘李四’,‘女’);
3、建表后如何指定主键约束
alter table 表名称 add primary key(字段列表);
create table t_stu(
sid int,
sname varchar(20),
gender char
);
alter table t_stu add primary key(sid);
4、主键约束分为两种:
(1)单列主键约束
单列如3
(2)复合主键约束
建表时如何指定复合主键约束:
create table 表名称(
字段名1 数据类型,
字段名2 数据类型,
…,
primary key(字段列表)
);
建表后如何指定复合主键约束:
alter table 表名称 add primary key (字段列表);
建立课程表,
create table t_course(
cid int primary key,
cname varchar(20)
)
现在要求创建一个选课表,表中sid和cid的组合是主键,是唯一的
create table xuanke(
sid int,
cid int,
score int,
primary key(sid,cid)
);
5、删除主键约束
alter table 表名称 drop primary key;
二、唯一约束:UNIQUE KEY
1、特点
(1)一个表可以有多个唯一键约束
(2)唯一键约束可以为NULL
(3)唯一键约束名可以自己指定,也可以默认。如果单列唯一,默认就是列名,如果是多列组合唯一,那么默认是该组合第1列的名称。
(4)创建唯一键约束,也会在对应列上创建索引。而且删除唯一键约束的方式是通过删除对应索引来实现的。
2、建表时如何指定唯一键
(1)单列的唯一键
create table 表名称(
字段名1 数据类型 primary key,
字段名2 数据类型 unique key,
…
);
(2)多列组合的唯一键
create table 表名称(
字段名1 数据类型 primary key,
字段名2 数据类型 ,
…,
unique key(字段列) --既适用于单列,也适用于多列
);
create table books(
bid int primary key,
bname varchar(20) unique key,
price double
);
唯一键作用示例:
insert into books values
(1,’《Java从入门到放弃》’,100),
(2,’《Java从入门到放弃》’,80);
bname不相同时才可插入数据。
4、建表后指定唯一键约束
alter table 表名称 add unique key(字段列表);
5、删除唯一键约束
alter table 表名称 drop index 索引名;
6、查看某个表的索引
show index from 表名称;
三、非空约束:NOT NULL
1、特点
(1)一个表可以有很多的非空约束
(2)非空约束只能针对某一个字段来说
(3)非空约束意味着该字段不能为null值
2、建表时指定非空约束
create table 表名称(
字段名1 数据类型 primary key,
字段名2 数据类型 【unique key】 not null,
字段名2 数据类型 not null,
…
);
3、建表后指定字段非空
alter table 表名称 modify 字段名 数据类型 not null;
4、删除非空约束
alter table 表名称 modify 字段名 数据类型;
四、默认值约束:DEFAULT
1、特点
(1)一个表可以有很多的非空约束
(2)非空约束只能针对某一个字段来说
(3)非空约束意味着该字段如果没有手动赋值,则会按照默认值赋值
2、建表时指定默认值约束
create table 表名称(
字段名1 数据类型 primary key,
字段名2 数据类型 【unique key】 【not null】 default 默认值,
字段名2 数据类型 default 默认值,
…
);
数据插入时:
insert into t_stu values(1,‘张三’,default);
insert into t_stu(sid,sname) values(1,‘张三’);
3、建表后指定某个字段有默认值约束
alter table 表名称 modify 字段名 数据类型 default 默认值;
提醒:
create table t_stu(
sid int primary key,
sname varchar(20) not null,
gender char not null
);
若增加默认值得字段本身为非空,再添加默认值时,需:
alter table t_stu modify gender char default ‘男’ not null;
4、取消默认值约束
alter table 表名称 modify 字段名 数据类型 【not null】;
五、检查约束:CHECK
mysql中暂不支持
1、语法
create table t_stu(
sid int primary key,
sname varchar(20),
gender char check(‘男’ or ‘女’)
);
表示gender字段只能输入“男”或者“女”,其他值均不行。
六、自增约束
1、特点
(1)一个表只能有一个自增约束。因为一个表只有一个维护自增值的变量
(2)自增约束的列只能是整数列
(3)自助呢公约数的列必须是键列(主键、唯一键、外键),实际中一般是主键自增最多
2、建表时指定自增约束
create table 表名称(
字段名1 数据类型 primary key auto_increment,
字段名2 数据类型 【unique key】 【not null】 default 默认值,
字段名2 数据类型 default 默认值,
…
);
3、给自增列添加数据
自增列中,如果指定值,就按照指定的来,如果没有指定值就自增。
如果指定的值为0或null,就按照上一数据自增
insert into t_stu(sname) values(‘张三’); #sid = 1
insert into t_stu(sname) values(‘李四’); #sid = 2
insert into t_stu values(5,‘李四’); #sid = 5
insert into t_stu(sname) values(‘赵六’); #sid = 6
insert into t_stu values(0,‘钱七’); #sid = 7
insert into t_stu values(null,‘王八’); #sid = 8
insert into t_stu values(-1,‘负数’); #sid = -1
insert into t_stu(sname) values(‘哟哟哟’); #sid = 9
insert into t_stu values(3,‘没有的3’); #sid = 3
insert into t_stu(sname) values(‘切克闹’); #sid = 10
4、建表后增加自增约束
alter table 表名称 modify 字段名 数据类型 auto_increment;
5、取消自增约束
alter table 表名称 modify 字段名 数据类型;
七、外键约束
1、特点:
(1)一个表可以有很多个外键约束
(2)外键约束是需要一个表的两个字段或两个表的两个字段之间建立的
(3)外键约束一定是从表/字表中建立的
(4)在从表中外键约束的字段/列,与在主表中外键约束参考的字段/列,这两个列的名称可以不同
(5)外键约束是同时约束双方的行为的:
对于主表来说:修改和删除受到了约束
对于从表来说:修改和添加受到了约束
(6)主表被参考的字段/列必须是键列。意味着主表被约束字段为主键或者唯一键
建表时,先建主表,再建从表。
删除时,先建从表,再删主表。
举例:
1)部门表和员工表
员工表中有一个字段,表示该员工所在的部门
部门表是主表
员工表是从表,意味着员工进入的是哪个部门
所以外键建立在员工表中
部门表中表示部门编号,用did表示,数据类型int
员工表中表示该员工所在部门,用编号时,可以选择同名(did)或者其他名字
2)学生表、课程表、选课表
主表:学生表和课程表
从表:选课表,其中外键有两个,一个是参考学生表,一个是参看课程表
2、约束的等级
(1)Cascade方式:级联
主动权在主表上。
如果主表被依赖字段修改了,从表对应的外键字段跟着修改
如果主表被依赖字段的记录被删除了,从表对应的外键字段的记录也会删除
(2)Set null 方式
主动权在主表上。
如果主表被依赖字段修改了,从表对应的外键字段设置为null
如果主表被依赖字段的记录被删除了,从表对应的外键字段的设置为null
其中要求:外键字段必须不能有非空约束。
(3)No action方式:不作处理
(4)Restrict方式:
(3)和(4)中,如果主表的被依赖字段的值被引用了,那么主表对该字段的修改和删除就被完全限制了。即不能修改和删除。
若想处理,必须先处理从表对应的值,才能进行修改和删除。
(5)Set default方式:mysql的Innodb引擎不支持
3、建表时指定外键约束
create table 表名称(
字段名1 数据类型 primary key auto_increment,
字段名2 数据类型 【unique key】 【not null】 default 默认值,
字段名2 数据类型 default 默认值,
…,
foreign key(从表的某字段) references 主表名(被参考字段) 【on update 等级】 【on delete 等级】
);
例如:
create database 11_db;
use 11_db;
#主表
create table dept(
did int primary key,
dname varchar(20)
);
#从表
create table emp(
eid int primary key,
ename varchar(20),
did int,
foreign key(did) references dept(did) on update cascade on delete set null
);
4、建表后指定外键约束
alter table 从表名称 add foreign key(从表的某字段) references 主表名(主表被引用字段) 【on update 等级】 【on delete 等级】;
5、删除外键约束
alter table 从表名称 drop foreign key 约束名;
6、查看某个表的外键约束名
select * from information_schema.table_constraints where table_name = ‘表名称’;