Postgresql
多源 CASCADE DELETE 行為
我無法理解 Postgres 的
CASCADE
DELETE
行為。如果
table_A
REFERENCES
table_B
, 並且被引用的列可能具有相同值的多個實例,那麼即使在 a 上仍然存在有效引用,該table_A
行也會是d嗎?DELETE``table_B
DELETE
如果是這樣,
table_A
只有在沒有有效引用DELETE
的情況下才能被刪除?CASCADE
我認為您一定誤解了
CASCADE
外鍵和/或一般外鍵的規則。外鍵只能引用具有唯一約束或主鍵的表。因此,在您的範例中,如果引用的列中可以有多個值實例,則無法創建外鍵引用。
table_b
當你
DELETE FROM ...
一個表,而另一個表有一個ON DELETE CASCADE
外鍵引用它時,所有引用的行都會從另一個表中刪除。引用的列不能有該值的多個實例,因為您不能為不是 的列創建外鍵
unique
。具有約束的表的引用列可能有多個引用被引用表中的列的值。如果是這樣,當引用的值被刪除時,所有這些都將被刪除,正如您在
CASCADE
.regress=> CREATE TABLE table_b (id integer); CREATE TABLE regress=> INSERT INTO table_b (id) VALUES (1), (2), (3), (1); INSERT 0 4
無法創建外鍵,沒有唯一約束或 PK:
regress=> CREATE TABLE table_a (b_id integer REFERENCES table_b(id) ON DELETE CASCADE); ERROR: there is no unique constraint matching given keys for referenced table "table_b"
無法添加 PK 或唯一約束,有重複項:
regress=> ALTER TABLE table_b ADD PRIMARY KEY (id); ERROR: could not create unique index "table_b_pkey" DETAIL: Key (id)=(1) is duplicated.