Loading

【数据库】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的定义&用法

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

 

posted @ 2020-02-26 17:17  ArkiWang  阅读(274)  评论(0编辑  收藏  举报