mysql 级联数据拆分 mysql设置级联删除_表名


这篇是对前面一些知识的补缺补漏还有关于触发器

先写几个前提


mysql 级联数据拆分 mysql设置级联删除_字段_02


mysql 级联数据拆分 mysql设置级联删除_mysql 级联数据拆分_03


mysql 级联数据拆分 mysql设置级联删除_字段_04


mysql 级联数据拆分 mysql设置级联删除_字段_05


关于主键约束

违约拒绝执行

如何检查违约处理:

方法一:进行全表扫描 效率低

方法二:进行索引的建立,通过B+树进行检查。 效率高

外键约束:

建立两个表之间的联系,在本表该属性有的值,表2中的字段也有

(1)创建外键约束(这里时在初始化的时候建立)

foreign key(本表的字段名1,字段2,...) reference 表2的名称(表2中的主键字段,表3中的主键字段名,...)

表2中的字段必须是主键


mysql 级联数据拆分 mysql设置级联删除_字段_06


破坏情况:

1.


mysql 级联数据拆分 mysql设置级联删除_字段_07


2.


mysql 级联数据拆分 mysql设置级联删除_mysql 级联数据拆分_08


3.


mysql 级联数据拆分 mysql设置级联删除_mysql 级联数据拆分_09


4.


mysql 级联数据拆分 mysql设置级联删除_字段_10


违约处理方式:


mysql 级联数据拆分 mysql设置级联删除_字段_11


mysql 级联数据拆分 mysql设置级联删除_mysql级联删除_12


mysql 级联数据拆分 mysql设置级联删除_字段_13


(2)对于如何设置级联,拒绝,和设置为空值 只有外键约束拥有

在约束的定义后面加上

级联

on 操作(egg.delete) cascade

拒绝

on 操作 no action

设置为空

on 操作 set null

举个栗子:设置Student的Sno为SC表的外键约束,且为级联删除


mysql 级联数据拆分 mysql设置级联删除_字段_14


设置同时为级联删除和级联更新

在on delete cascade后面加一行on update cascade


其他约束:

1.叠加定义约束

egg:

unique not null

2.这里补充一个约束

定义属性值应该满足的条件

类型1.

初始化时添加

字段 类型, Check(字段 in(值1,值2..))

修改时添加


mysql 级联数据拆分 mysql设置级联删除_mysql 级联数据拆分_15


字段 类型, Check(范围)

类型2.

初始表时放在字段声明后

check(条件)

一般来说第二种类型比较好

检查和违规处理

检查插入值是否满足,不满足则拒绝

为约束命名

Constraint 约束名 约束语句

删除约束

Alter table 表名

drop constraint 约束名


mysql 级联数据拆分 mysql设置级联删除_mysql级联删除_16


增加约束

alter table 表名

add constraint 约束名 约束定义


mysql 级联数据拆分 mysql设置级联删除_触发器_17


修改约束

先删除后增加


断言

反正我没有测试出来,而且mysql官方文档也没有查到assertion

对于多个表的限制条件

1.增加断言

check assertion 断言名

check(子句)

子句和where子句的格式类似

egg:

选修数据库的学生不能多于60


mysql 级联数据拆分 mysql设置级联删除_表名_18


mysql 级联数据拆分 mysql设置级联删除_字段_19


2.删除断言

drop assertion 断言名


触发器

在某事件发生的时候触发

1.定义触发器

create trigger 触发器名

before|after 触发事件 on 表名

referencing new|old row|table as 变量 解释:将这行|表的旧|新的命名为变量名

for each row|statement

[when 触发条件] 触发动作体

如果省略[when 触发条件]则触发动作体在触发器激活后立即执行

row 行级触发器

statement 语句级触发器

如果是行级触发器,用户可以在过程体中使用new和old引用事件之后的新值和事件之前的旧值,如果时语句级触发器,则不能在触发动作体中使用new或old进行引用

上面是我书上看来的。。。然而用不了

下面是一般用法

create trigger 触发器名

after|before insert|update|delete

on 表名

for each row

begin

SQL语句; 这里是触发程序

end;

before:在执行触发事件之前触发

after:在执行触发事件之后触发

如果触发动作执行失败,激活触发器事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化

注意:触发器名和表名要在同一模式下

old表示旧记录,new表示新记录

对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及OLD同时使用。

old是只读的,在触发程序中只能引用它,不能更改它。在before触发程序中。可以使用“set new.字段名=值”更改new记录的值。但是在after触发程序中不能使用“set new.字段名=值”更改记录的值。


mysql 级联数据拆分 mysql设置级联删除_表名_20


标准8.0文档

egg:


mysql 级联数据拆分 mysql设置级联删除_表名_21


举个栗子1:下面的是行不通的


mysql 级联数据拆分 mysql设置级联删除_字段_22


mysql 级联数据拆分 mysql设置级联删除_mysql级联删除_23

变了一下

栗子2.


mysql 级联数据拆分 mysql设置级联删除_表名_24


mysql 级联数据拆分 mysql设置级联删除_触发器_25


2.激活触发器

(1)触发器的执行时有触发事件激活的,并有数据库服务器自动执行

(2)一个数据表上可能定义了多个触发器,遵循下列执行顺序

执行该表上的before触发器

激活触发器的sql

执行该表上的after触发器

3.删除触发器

drop trigger 触发器名 on 表名

上面语句也不行。。。


mysql 级联数据拆分 mysql设置级联删除_mysql 级联数据拆分_26


我这里改了一下结束符


mysql 级联数据拆分 mysql设置级联删除_触发器_27


触发器可以用来设置级联操作

查看触发器的定义

1.

show trigger like 模式 G

上面的中模式 eg:

”stu%“ 表示查找触发器所在表的名称的前几个字符为stu

2.

show create trigger 触发器名

查看指定触发器名的定义

3.

select * from information_schema.triggerG

由于mysql的所有触发器的定义都存放在information_schema数据库的trigger表中,所以查看所有触发器的详细信息可以像上面一样。

我也是挺无语的,这课上的和实际的挺多不一样的。。。。