我在SQL Server 2012数据库中有一个存储过程。我从PARENT表中删除然后删除CHILD表行。 CHILD表有一个指向父表中主键的外键。
如果删除的顺序全部在BEGIN END块内,那么它的顺序是否重要?我必须在PARENT行之前删除CHILD行吗?
答案 0 :(得分:1)
虽然某些数据库系统支持可延迟约束,但在SQL Server中,必须在每个单独语句的末尾满足所有约束。因此,除非外键具有允许删除的ON DELETE
规范,否则在没有子行引用它们之前,您将无法删除父行。
但是,还应该注意,BEGIN
...END
在这里没有影响。它们只是将几个陈述组合在一起的一种手段。即使在支持可延迟约束的数据库系统中,也会根据事务来处理延迟。交易以BEGIN TRANSACTION
和COMMIT [TRANSACTION]
(或ROLLBACK
)开始完成,而不是BEGIN
... END
。