Foreign-Key
ON DELETE CASCADE 與 JSON 有何關係?
對於關係數據庫,有
ON DELETE CASCADE
. 使用 JSON 時,這兩個概念如何關聯?是否ON DELETE CASCADE
支持 JSON?你能舉一個支持
ON DELETE CASCADE
或允許解決這個問題的 JSON-DB 的例子嗎?
你在這裡很困惑,
- JSON 是一種數據交換格式,在 PostgreSQL 中,我們提供了一種具有驗證
json
和jsonb
索引等優點的格式,可幫助您使用這種格式。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}' );
如果您嘗試插入
tbar
或tbaz
除上述之外的任何內容,您將被拒絕,-- 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
索引)。這意味著,您可以像我們上面所做的那樣混合這兩個概念。但是你永遠不應該這樣做,而且我在實踐中從未見過這樣做。一般來說,你穿上orFOREIGN 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 );