约束是作为一种防止往数据表中插入错误的数据,维护数据完整性的规则
MySQL定义了六种约束
主键约束,唯一约束,自增,非空约束,默认值,外键约束
主键约束
关键字
PRIMARY KEY
设置方式
建表时添加
CREATE TABLE manage(
PID int(4) not null AUTO_INCREMENT PRIMARY KEY,
--其他字段定义
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
//--------------------------------------------------------------------------------
CREATE TABLE manage(
PID int(4) not null AUTO_INCREMENT,
Sname varchar(30) not null,
--其他字段定义
PRIMARY KEY(PID,Sname) //复合主键
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
修改表
ALTER TABLE manage ADD PRIMARY KEY(PID);
ALTER TABLE manage ADD PRIMARY KEY(PID,Sname); //或复合主键
特点
保证主键数据唯一,且不可为空,一个表只能有一个主键,可以是复合主键,复合主键保证联合数据不重复(只要有一个字段不重复就可以)
唯一约束
关键字
UNIQUE
设置方式
建表时添加
CREATE TABLE manage(
PID int(4) not null AUTO_INCREMENT PRIMARY KEY,
Sname varchar(30) UNIQUE,
--其他字段定义
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
//--------------------------------------------------------------------------------
CREATE TABLE manage(
PID int(4) not null AUTO_INCREMENT,
Sname varchar(30) not null,
--其他字段定义
PRIMARY KEY(PID),
UNIQUE(Sname)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
修改表
ALTER TABLE manage ADD UNIQUE(Sage);
特点
数据不能重复, 可以为null(允许多个null数据),UNIQUE约束可以有多个。
自增
关键字
AUTO_INCREMENT
设置方式
建表时添加
如上
修改表
ALTER TABLE manage MODIFY PID int AUTO_INCREMENT;
特点
只能作用于主键字段或复合主键中第一个字段,数据升序保存。
非空约束
关键字
not null
特点
约束该字段是否允许null值
默认值约束
关键字
default
设置方式
CREATE TABLE manage(
Sex enum('女','男') DEFAULT '女' not null,
Signon_at datetime DEFAULT CURRENT_TIMESTAMP
-- 其他字段定义
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
特点
默认值约束将自动填充默认数据
外键约束
MYSQL有两种常用的存储引擎类型:MyISAM和InnoDB,目前只有InnoDB引擎类型支持外键约束
关键字
CONSTRAINT 给外键取名,可以省略,默认外键字段名
FOREIGN KEY(外键字段)
REFERENCES 主表(主键) 不可省略
设置方式
建表时添加
CREATE TABLE book(
PID int not null,
CONSTRAINT book_manage FOREIGN KEY(PID) REFERENCES manage(PID)
-- 其他字段定义
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
修改表时
ALTER TABLE book ADD CONSTRAINT book_manage FOREIGN KEY(PID) REFERENCES manage(PID)
特点
保证多个表引用完整性,注意,外键和主键必须具有相同的数据类型,子表和主表必须都是InnoDB表。
外键约束动作
解释一下四种动作
CASCADE :子表和主表做出相同的动作
NO ACTION :主表试图更新和删除,但是子表不做出反应(可以认为子表不准主表动),导致主表更新或删除数据失败
适用场景:当用户存在订单信息时,不允许修改用户的关键信息以及删除用户(防止误删)。
RESTRICT:和NO ACTION作用一样,拒绝主表更新和删除数据(默认动作)。
SET NULL:主表更新或删除数据时,子表将数据置NULL
适用场景:比如用户注销自己的账户,默认放弃该用户的订单。
设置方式(建表时(这里就略过吧),修改表)
ALTER TABLE book ADD
CONSTRAINT book_manage
FOREIGN KEY(PID)
REFERENCES manage(PID)
ON DELETE CASCADE --或其他三种动作
ON UPDATE CASCADE --或其他三种动作
简单演示一下CASCADE
manage准备数据,看一下建立PID外键约束的book,可以看到book中PID只允许插入1,2,3的数据
然后我们试图更新manage中PID为2的数据,将其改为4,可以发现book中PID为2的数据也被修改为4
然后我们尝试删除manage中PID为4的数据行记录,可以发现book表中PID为4的数据也被删除了