我很好奇我是否可以依赖任何特定的验证NOT NULL,FOREIGN KEY,UNIQUE,CHECK约束和BEFORE触发器的顺序.
根据经验,我知道MySQL首先检查NOT NULL,然后启动BEFORE触发器,然后检查UNIQUE约束. Oracle在BEFORE触发器后检查NOT NULL(我相信sqlServer也是如此,但不记得了).标准是否对订单有所说明,或者完全取决于数据库供应商?
解决方法
该特定行为似乎是
bug in MySQL,它只影响BEFORE INSERT触发器,而BEFORE UPDATE触发器的行为正确.
standard(与问题评论相关联)肯定没有明确说明,但它绝对暗示:
For each state change SCi,j in TECi,the BEFORE triggers activated by SCi,j are executed before any of their
triggering events take effect. When those triggering events have taken effect,any AFTER triggers activated by
the state changes of TECi are executed.
NOT NULL错误应该是INSERT或UPDATE的一部分(即触发事件).标准不应该指定这个.绝对没有必要先对一组不是最终的更改进行约束,因为您的BEFORE触发器既能解决错误又能引入新错误.
总结:这实际上并不取决于数据库供应商,因为始终需要在before触发器之后检查约束.