一、约束的概念和分类
- 约束的概念
- 约束是作用于表中 列上的规则,用于限制加入表的数据
- 约束的存在保证了数据库中数据的正确性、有效性和完整性
分类:
Tips:mysql不支持检查约束
eg:
CREATE TABLE EMP(
ID INT PRIMARY KEY,-- 员工id,主键且自增长
ENAME VARCHAR(50) NOT NULL UNIQUE,-- 员工姓名,非空且唯一
JOINDATE DATE NOT NULL,-- 入职日期,非空
SALARY DOUBLE(7,2) NOT NULL,-- 工资,非空
BONUS DOUBLE(7,2) DEFAULT 0-- 奖金,如果没有奖金默认值为0
);
-- 演示主键约束:非空且唯一
INSERT INTO EMP VALUES(1,'张三','1999-11-11',8000,9000);
INSERT INTO EMP VALUES(null,'张三','1999-11-11',8000,9000); -- 创建失败,主键不能为空
INSERT INTO EMP VALUES(1,'李四','1999-11-11',8000,9000); -- 创建失败,主键唯一
-- 演示非空约束
INSERT INTO EMP VALUES(2,null,'1999-11-11',8000,9000);-- 创建失败,姓名not null非空
-- 演示唯一约束
INSERT INTO EMP VALUES(2,'李四','1999-11-11',8000,9000);
INSERT INTO EMP VALUES(3,'李四','1999-11-11',8000,9000);-- 创建失败,姓名unique唯一
-- 演示默认约束
INSERT INTO EMP(id,ename,joindate,salary) VALUES(4,'王五','1999-11-11',8000);-- 创建成功,bonus默认值为0
-- 演示自动增长:auto_increment:当列是数字类型并且 唯一约束
CREATE TABLE EMP(
ID INT PRIMARY KEY auto_increment,
ENAME VARCHAR(50) NOT NULL UNIQUE,
JOINDATE DATE NOT NULL,
SALARY DOUBLE(7,2) NOT NULL,
BONUS DOUBLE(7,2) DEFAULT 0
);
INSERT INTO EMP(ename,joindate,salary) VALUES('王五','1999-11-11',8000); -- 创建成功,因为自增长,即使不填
INSERT INTO EMP(id,ename,joindate,salary) VALUES(null,'王五1','1999-11-11',8000);-- 创建成功,因为自增长,即使为空
*二、演示外键约束:
- 添加约束:
- 删除约束
eg:
员工表的 dep_id 列 与 部门表的 id 列进行关联
-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
drop table if EXISTS emp;
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept foreign key(dep_id) references dept(id)
);
-- 添加2个部门
insert into dept(dep_name ,addr) values ('研发部','广州'),('销售部','深圳');
-- 添加员工,dep id 表示员工所在的部门
INSERT INTO emp(NAME,age,dep_id)VALUES
('张三',20,1),
('李四',20,1),
('王五',20,1),
('赵六',20,1),
('孙七',22,1),
('周八',18,2);
--删除外键
alter table emp drop FOREIGN key fk_emp_dept;
-- 建完表后,添加外键
alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);