我在我的公共模式中创建了许多表。
有时,我需要在users
执行测试时运行播种器来刷新表。为此,我正在执行TRUNCATE TABLE users RESTART IDENTITY CASCADE
.
但是,除了与该表相关的表之外,我不希望任何其他表users
受到影响。引用该表的唯一外键位于通过引用的users
表上。该表按预期截断。teams
users
owner_id
teams
出乎意料的是,该attributes
表也被截断了TRUNCATE TABLE users RESTART IDENTITY CASCADE
。
该表在引用该表的attributes
表上有一个外键。但是,在表中,所有值都是如此,因此没有对表中特定记录的任何记录的实际引用。实际上,在执行truncate query的时候,整个表已经是空的了。accounts
users
attributes
account_id
NULL
accounts
accounts
那么是如何TRUNCATE TABLE users RESTART IDENTITY CASCADE
导致我的属性表根据NULL
外键被截断的呢?
我认为
TRUNCATE ... CASCADE
不对外键值进行任何引用检查,这会破坏目的。仅仅存在连接attributes
到users
via的参照完整性约束就会导致所有三个(可能更多)表被截断(如果不是空的accounts
,您会注意到)。accounts