【数据库】MyQSL数据完整性
不知道怎么取标题,简单提一下数据库的完整性实现问题
在MySQL中一种不用写trigger也可以实现级联的方式——直接使用外键实现参照完整性(当然trigger的功能不只是实现级联修改/删除,还可以实现一些动态完整性约束
除此之外还可以通过check约束实现用户定义完整性
alter table score add constraint dcheck check (Degree>=0)
trigger比上述的外键和check约束更为灵活
- trigger的格式:
CREATE TRIGGER [trigger_name] [AFTER|BEFORE] [INSERT|UPDATE|DELETE] ON [talbe_name] FOR EACH ROW BEGIN SQL STATEMENT; END;
-
- BEFORE|AFTER表示了触发器的行动时间,触发器在每行插入表之前|后被激活。
- INSERT|UPDATE|DELETE表示激活触发器的事件
- FOR EACH ROW后的语句定义了触发器的具体部分
- trigger特点:表级自动调用
- MySQL trigger要求不完全归纳(穷举试错+官方 docs
- 不允许在After条件下改变New
ERROR 1362: Updating of NEW row is not allowed in after trigger
CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`score_BEFORE_INSERT` BEFORE INSERT ON `score` FOR EACH ROW BEGIN IF new.Degree < 60 then set new.Degree = 60; end if; END
-
- AFTER的用法
set @sum=0; CREATE DEFINER=`root`@`localhost` TRIGGER `test`.`score_AFTER_INSERT` AFTER INSERT ON `score` FOR EACH ROW BEGIN SET @sum = @sum + 1; END insert into Score values(103,'9-888',92); insert into Score values(103,'6-166',92); select @sum as 'total amount';
此时sum为2