我很好奇我是否可以依赖任何特定的验证NOT NULL, FOREIGN KEY, UNIQUE, CHECK约束和BEFORE触发器的顺序.
根据经验,我知道MySQL首先检查NOT NULL,然后启动BEFORE触发器,然后检查UNIQUE约束.Oracle NOT NULL在BEFORE触发后检查(我相信SQLServer也会这样做,但不记得).标准是否对订单有所说明,或者完全取决于数据库供应商?
这种特定的行为似乎是MySQL 中的一个错误,它只影响BEFORE INSERT触发器,而BEFORE UPDATE触发器的行为是正确的。
标准(如问题评论中链接的)当然没有明确说明,但它绝对是暗示的:
对于 TECi 中的每个状态变化 SCi,j,由 SCi,j 激活的 BEFORE 触发器在其任何触发事件生效之前执行。当这些触发事件生效时,将执行由 TECi 状态更改激活的任何 AFTER 触发器。
错误应该是orNOT NULL的一部分(即触发事件)。标准不需要指定这一点。预先检查一组非最终更改的约束是绝对没有意义的,因为您的触发器既能够解决错误又能够引入新错误。INSERTUPDATEBEFORE
摘要:这确实不取决于数据库供应商,因为始终需要在 before 触发器之后检查约束。