约束
概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。
分类:

# 前几个约束
建表
-- 创建带约束的表格 CREATE TABLE emp( id INT PRIMARY KEY auto_increment, -- 员工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(id,ename,joindate,salary,bonus) VALUES(1,'diana','1999-01-01',8800,5000); INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(2,'凉冰','1999-02-01',8000,4000); -- 主键约束 非空且唯一 INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(1,'凉冰','1999-02-01',8000,4000); -- 不能重复为1 INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(3,'莫甘娜','1999-03-01',10000,4000); -- 非空约束 INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(4,'凉冰',null,8000,4000);-- 不能为null -- 唯一约束 INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(5,'凉冰','1999-05-01',8000,4000);-- 不能重复为凉冰 -- 默认约束 INSERT INTO emp(id,ename,joindate,salary) VALUES(4,'彦','1999-06-01',6000);-- 奖金默认为0 -- 演示自增长 INSERT INTO emp(id,ename,joindate,salary,bonus) VALUES(NULL,'凯尔','1999-07-01',9000,1000);-- id 自动设置为5 INSERT INTO emp(ename,joindate,salary,bonus) VALUES('阿托','1999-08-01',5000,1000);-- id 自动设置为6 -- 查询数据 SELECT * from emp;
# 外键约束
数据准备
-- 准备数据 create table dept( id int auto_increment comment 'ID' primary key, name varchar(50) not null comment '部门名称' )comment '部门表'; INSERT INTO dept (id, name) VALUES (1, '研发部'), (2, '市场部'),(3, '财务部'), (4, '销售部'), (5, '总经办'); create table emp( id int auto_increment comment 'ID' primary key, name varchar(50) not null comment '姓名', age int comment '年龄', job varchar(20) comment '职位', salary int comment '薪资', entrydate date comment '入职时间', managerid int comment '直属领导ID', dept_id int comment '部门ID' )comment '员工表'; INSERT INTO emp (id, name, age, job,salary, entrydate, managerid, dept_id) VALUES (1, '金庸', 66, '总裁',20000, '2000-01-01', null,5), (2, '张无忌', 20, '项目经理',12500, '2005-12-05', 1,1), (3, '杨逍', 33, '开发', 8400,'2000-11-03', 2,1), (4, '韦一笑', 48, '开发',11000, '2002-02-05', 2,1), (5, '常遇春', 43, '开发',10500, '2004-09-07', 3,1), (6, '小昭', 19, '程序员鼓励师',6600, '2004-10-12', 2,1);创建带外键约束的表格
--主表 要先创建表格,先添加数据 CREATE TABLE dept( id int PRIMARY KEY auto_increment, dep_name varchar(20), addr varchar(20) );CREATE TABLE emp2( --从表 id int PRIMARY KEY auto_increment, name varchar(20), age int, dep_id int, -- 添加外键 -- constraint 外键名 foreign key(外键列名) references 主表(外键关联的主表的列名) CONSTRAINT fk_emp2_dept FOREIGN KEY(dep_id) REFERENCES dept(id) );创建表格后,手动添加约束
CREATE TABLE emp2( --从表 id int PRIMARY KEY auto_increment, name varchar(20), age int, dep_id int, );添加外键
ALTER TABLE emp2 add CONSTRAINT fk_emp2_dept FOREIGN KEY(dep_id) REFERENCES dept(id);删除外键
ALTER TABLE emp2 drop FOREIGN KEY fk_emp2_dept;
外键删除更新行为

CASCADE
-- dept(id) 更新/删除时,emp(dept_id)跟随更新/删除 alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade;set null
-- dept(id) 更新/删除时,emp(dept_id)置null alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update set null on delete set null;
上次更新: 2023 07 3
