我正在使用具有外键约束的复杂模式的 MySQL 5.5。
我想执行多个update
SQLdelete
语句。
在执行了这些语句的子集之后,可能会违反外键约束。
在所有这些语句都执行之后,就不应该违反外键约束。
我知道cascade
,我不想使用它,因为某些更改需要更复杂的逻辑。
我的问题是,有没有办法将我的多个语句组合在一起(作为一个多语句、事务等),以便在它们全部完成之前不检查外键约束?(如果出现错误,那么它们都不会被执行?)
MySQL 不实现延迟约束检查。从说明书来看,
偏离 SQL 标准:与一般的 MySQL 一样,在插入、删除或更新许多行的 SQL 语句中,InnoDB 逐行检查 UNIQUE 和 FOREIGN KEY 约束。在执行外键检查时,InnoDB 在它必须查看的子记录或父记录上设置共享行级锁。InnoDB 立即检查外键约束;检查不推迟到事务提交。 根据 SQL 标准,默认行为应该是延迟检查。也就是说,仅在处理完整个 SQL 语句后才检查约束。在 InnoDB 实现延迟约束检查之前,有些事情是不可能的,例如删除使用外键引用自身的记录。
所以没有办法只在一组 SQL 语句的末尾检查约束。