数据库完整性约束
1.约束(列级约束)
主键
外键
不为空
唯一
Default
Check(不支持)
2.触发器(行级约束)
在对某些表执行更新操作(insert,update,delete)时同时触发一些其他动作,对于查询操作不会触发任何动作
#查询系统中的触发器
select trigger_schema,trigger_name from information_schema.triggers;
#触发器中不允许执行查询操作
create trigger trg_01#创建触发器 名为 trg_01
after delete#当执行过删除后触发 before 在之前触发
on employee#触发器绑定到employee表中
for each row#行级触发
BEGIN
insert into tb_log(msg) values('员工数据被删除');
end;
#删除触发器
drop trigger trg_01;
#复制表(包括结构数据)
#create table emp_off as select num,name,tel,email,depno,birth from employee;
#复制表结构
#create table emp_temp as select * from employee limit 0,0;
/*
mysql不允许在同一张表上绑定多个同类型触发器(同时做删除,更新,添加)
有一张离职员工表,内部的数据根据员工表删除操作做记录
*/
create trigger trg_empoff
after DELETE
on employee
for each ROW
BEGIN
#new old
insert into emp_off(num,name,tel,email,depno,birth) values(old.num,old.name,old.tel,old.email,old.depno,old.birth);
end;
/*
创建一个触发器,在员工表上,做修改操作之前,将原来记录行以及修改后的记录数据存储到另一个表中
*/
create trigger trg_modify
before UPDATE
on employee
for each ROW
BEGIN
#添加老数据
insert into emp_temp(num,name,tel,depno,bak) values(old.num,old.name,old.tel,old.depno,'old data');
#添加新数据
insert into emp_temp(num,name,tel,depno,bak) values(new.num,new.name,new.tel,new.depno,'new data');
end
/*
利用触发器解除约束关系
为部门表添加触发器,当删除部门表中记录时,修改员工表关联当前部门,将员工的部门设置为null
*/
create trigger trg_del_dept
before DELETE
on department
for each ROW
BEGIN
update employee set depno=null where depno=old.depno;
end;