Foreign-Key

ON DELETE CASCADE 與 JSON 有何關係?

  • March 9, 2019

對於關係數據庫,有ON DELETE CASCADE. 使用 JSON 時,這兩個概念如何關聯?是否ON DELETE CASCADE支持 JSON?

你能舉一個支持ON DELETE CASCADE或允許解決這個問題的 JSON-DB 的例子嗎?

你在這裡很困惑,

  • JSON 是一種數據交換格式,在 PostgreSQL 中,我們提供了一種具有驗證jsonjsonb索引等優點的格式,可幫助您使用這種格式。
  • ON DELETE CASCADE是一個子句,它告訴引用表在它所引用的表失去它所引用的行時要做什麼。

可以混合這兩個概念,但你不應該這樣做

CREATE TABLE tfoo ( qux jsonb PRIMARY KEY );
CREATE TABLE tbar ( qux jsonb REFERENCES tfoo );
CREATE TABLE tbaz ( qux jsonb REFERENCES tfoo ON DELETE CASCADE );

現在我們可以在 中插入一些測試數據tfoo

INSERT INTO tfoo (qux) VALUES ( '{"id":42}' );
INSERT INTO tfoo (qux) VALUES ( '{"id":7}' );

如果您嘗試插入tbartbaz除上述之外的任何內容,您將被拒絕,

-- Rejection
INSERT INTO tbar (qux) VALUES ( '{"id":2}' );
ERROR:  insert or update on table "tbar" violates foreign key constraint "tbar_qux_fkey"
DETAIL:  Key (qux)=({"id": 2}) is not present in table "tfoo".

這是一個非常糟糕的主意,儘管有很多原因。我們可以在這裡看到這些雖然有效,

INSERT INTO tbar (qux) VALUES ( '{"id":42}' );   -- ON DELETE REJECT
INSERT INTO tbaz (qux) VALUES ( '{"id":7}' );    -- ON DELETE CASCADE

而且,我們可以看到效果——其中{"id":7}tbaz``ON DELETE CASCADE

DELETE FROM tfoo WHERE qux = '{"id":7}';

而且,這會失敗,{"id":42}如果tbar您從中刪除該條目,它不知道該怎麼做,tfoo因此它拒絕操作。

DELETE FROM tfoo WHERE qux = '{"id":42}';
ERROR:  update or delete on table "tfoo" violates foreign key constraint "tbar_qux_fkey" on table "tbar"                                              
DETAIL:  Key (qux)=({"id": 42}) is still referenced from table "tbar".

澄清

所以你可以看到你可以擁有ON DELETE CASCADE任何可以放在UNIQUE索引上的類型(PRIMARY KEY是一個特殊的UNIQUE NOT NULL索引)。這意味著,您可以像我們上面所做的那樣混合這兩個概念。但是你永遠不應該這樣做,而且我在實踐中從未見過這樣做。一般來說,你穿上or FOREIGN KEYS,int``text

CREATE TABLE tfoo (
 id_foo int     PRIMARY KEY
   GENERATED BY DEFAULT AS IDENTITY,

 qux    jsonb
);
CREATE TABLE tbar ( id_foo REFERENCES tfoo, qux jsonb );
CREATE TABLE tbaz ( id_foo REFERENCES tfoo ON DELETE CASCADE, qux jsonb );

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