如果我尝试从表中删除多行,并且由于数据库关系而无法删除其中一行,会发生什么?
不受关系约束的行是否仍会被删除?还是整个删除都会失败?
如果我尝试从表中删除多行,并且由于数据库关系而无法删除其中一行,会发生什么?
不受关系约束的行是否仍会被删除?还是整个删除都会失败?
在 MySQL 中,如果设置了外键约束,如果尝试插入不存在的 ID,或者尝试删除现有的 ID,则查询将失败。
换句话说,您的删除将失败。
如果是单个删除语句,则整个删除将失败。
所有的行都会删除就好了。但是,您应该确保您的程序删除相关行,否则会丢失帖子/记录/任何可能发生的情况。
这里有一个更普遍的问题:
答案基本上是“他们都没有受到影响,即使是已经成功的”。
内部发生的事情相当复杂。InnoDB 支持事务保存点,数据库在当前事务中的语句开头创建一个隐式保存点。如果语句中途失败,则会回滚到隐式保存点。这意味着看起来该语句从未发生过(除非人们坚持使用 READ_UNCOMMITTED 隔离级别,如果他们关心的话,他们不应该这样做)。
无论您是否使用显式事务,都会发生这种情况。如果您使用显式事务,则当前事务不会回滚(除了某些类型的错误,例如死锁和锁等待超时,它必须这样做才能使死锁被打破),而只会回滚至声明的开头。