gro*_*wse 4 foreign-key sql-server transaction
我对以下场景的预期和实际行为有疑问。
该场景是[table1]每天清除并重新加载数据库表 ( )的场景。该表有一个id列被其他几个使用外键的表引用。如果我将外键ON DELETE操作设置为CASCADE,显然如果我DELETE FROM [table1]在该表上发出单个命令,这将删除其他表中的行。但是,如果我要删除所有行,然后在同一事务下重新插入具有相同 ID 的相同行,会发生什么情况?这会触发级联中间事务,还是会在我调用 commit 后进行外键协调?
显然,我在这里考虑的是 SQL Server,但我想知道这种行为在其他数据库中是否也一致。
如果即使在事务中间也触发级联,那么管理外键和与每天完全清除并重新加载的表的关系的最佳方法是什么?
Jon*_*gel 11
我只熟悉 SQL Server:
每个操作都是原子的。如果您运行删除,并且它级联到其他表,那么一旦语句结束,这些记录也会消失。除非事务回滚,否则它们不会神奇地重新存在。
如果您依赖 ID 值并且不想级联相关表,请考虑切换到合并策略(您使用UPDATEor 的地方,最好是MERGE),而不是将所有内容都吹走并从头开始。
我想您可以尝试在数据加载期间禁用关系,但考虑到我认为您正在尝试做的事情,这似乎充满了危险。一定要先尝试合并策略。