Postgresql

多源 CASCADE DELETE 行為

  • February 12, 2014

我無法理解 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.

引用自:https://dba.stackexchange.com/questions/58700