什么是约束
约束的分类

注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果
#information_schema数据库名(系统库)
#table_constraints表名称(专门存储各个表的约束)
SELECT * FROM information_schema.table_constraints
WHERE table_name = '表名称';作用及特点
添加非空约束
CREATE TABLE emp(
id INT(10) NOT NULL,
NAME VARCHAR(20) NOT NULL,
sex CHAR(1) [null]
);ALTER TABLE emp
MODIFY sex CHAR(1) NOT NULL;删除非空约束
#去掉not null,相当于修改某个非注解字段,该字段允许为空
alter table 表名称
modify 字段名 数据类型 [NULL];
或
alter table 表名称
modify 字段名 数据类型;举例:
ALTER TABLE emp
MODIFY sex CHAR(1) NULL;作用及特点
添加唯一约束
create table 表名称(
字段名 数据类型, 字段名 数据类型 unique,
字段名 数据类型 unique [key],
字段名 数据类型
);
或
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] unique [key](字段名)
);举例:
-- 使用列级约束语法
create table student(
sid int,
sname varchar(20),
tel char(11) unique,
cardid char(18) unique key
);-- 使用表级约束语法
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
CONSTRAINT uk_user_id UNIQUE(id)
);#字段列表中如果是一个字段,表示该列的值唯一。
#如果是两个或更多个字段,那么复合唯一,即多个字段的组合是唯一的
#方式1:
alter table 表名称
add unique [key](字段列表);
#方式2:
alter table 表名称
modify 字段名 字段类型 unique [key];举例:
ALTER TABLE USER
ADD UNIQUE(NAME);ALTER TABLE USER
ADD CONSTRAINT uk_name
UNIQUE(NAME);ALTER TABLE USER
MODIFY NAME VARCHAR(20) UNIQUE;复合唯一约束
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] unique key(字段列表)
);举例:
#选课表
create table student_course(
id int,
sid int,
cid int,
score int,
constraint uk_sid_cid unique key(sid,cid) #学号和课程id的复合唯一
);删除唯一约束
举例:
ALTER TABLE USER
DROP INDEX uk_name;作用及特点
注意: Oracle主键约束名可以修改
添加主键约束
create table 表名称(
字段名 数据类型 primary key, #列级模式
字段名 数据类型,
字段名 数据类型
);
create table 表名称(
字段名 数据类型,
字段名 数据类型,
字段名 数据类型,
[constraint 约束名] primary key(字段名) #表级模式
);举例:
# 列级约束
CREATE TABLE emp4(
id INT PRIMARY KEY ,
NAME VARCHAR(20)
);
# 表级约束
CREATE TABLE emp5(
id INT NOT NULL ,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT pk_emp5_id PRIMARY KEY(id)
);
#字段列表可以是一个字段,也可以是多个字段,
#如果是多 个字段的话,是复合主键
ALTER TABLE 表名称
ADD PRIMARY KEY(字段列表); 举例:
ALTER TABLE emp5
ADD PRIMARY KEY(NAME,pwd);删除主键约束
alter table 表名称 drop primary key;说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。
作用及特点
指定自增约束
create table 表名称(
字段名 数据类型 primary key auto_increment,
字段名 数据类型,
字段名 数据类型,
字段名 数据类型
);
create table 表名称(
字段名 数据类型,
字段名 数据类型 unique key auto_increment,
字段名 数据类型,
primary key(字段名)
);alter table 表名称
modify 字段名 数据类型 auto_increment;举例:
create table employee(
eid int primary key ,
ename varchar(20)
);
alter table employee modify eid int auto_increment;通过desc employee查看

删除自增约束
#去掉auto_increment相当于删除
alter table 表名称
modify 字段名 数据类型; 举例:
alter table employee
modify eid int;MySQL 8.0新特性—自增变量的持久化
作用及特点
使用外键约束
create table dept( #主表
did int primary key, #部门编号
dname varchar(50) #部门名称
);
create table emp(#从表
eid int primary key, #员工编号
ename varchar(5), #员工姓名
deptid int, #员工所在的部门
constraint fk_dept_did foreign key (deptid) references dept(did)
#在从表中指定外键约束
#emp表的deptid和和dept表的did的数据类型一致,
#意义都是表示部门的编号
);
ALTER TABLE emp1
ADD [CONSTRAINT fk_emp_dept_id] FOREIGN KEY(dept_id) REFERENCES dept(dept_id);#删外键
alter table emp
drop foreign key fk_dept_did;
#查索引
SHOW INDEX FROM emp;
#删索引
alter table emp
drop index fk_dept_did;约束等级
举例:
create table dept(
did int primary key, #部门编号
dname varchar(50) #部门名称
);
create table emp(
eid int primary key, #员工编号
ename varchar(5), #员工姓名
deptid int, #员工所在的部门
foreign key (deptid) references dept(did)
#把修改操作设置为级联修改等级,把删除操作设置为set null等级
on update cascade on delete set null
);举例:
create table employee(
eid int primary key,
ename varchar(5),
gender char check ('男' or '女')
);
CREATE TABLE temp(
id INT AUTO_INCREMENT,
NAME VARCHAR(20),
age INT CHECK(age > 20),
PRIMARY KEY(id)
);给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
举例:
create table employee(
eid int primary key,
ename varchar(20) not null,
gender char(1),
#给tel字段增加默认是空字符串
tel char(11) not null default ''
);
#给gender字段增加默认值约束为男
alter table employee
modify gender char(1) default '男';