3
我有一個表:PG檢查親子驗證
CREATE TABLE MENUPOINT (
id BIGINT NOT NULL,
parent BIGINT,
name VARCHAR(64),
CONSTRAINT "MENUPOINT_pkey" PRIMARY KEY(id),
CONSTRAINT fkc75dac36251dd346 FOREIGN KEY (parent)
REFERENCES MENUPOINT(id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE
);
而這個內容:
id parent name
------------------------
1 null root
2 1 child
這一切都建立這種結構:
root
+- child
現在我需要檢查數據庫以檢查是否無法執行:
UPDATE MENUPOINT SET parent = 2 WHERE id = 1;
因爲:
- 我無法找出誰是根。
- 樹的顯示是無窮無盡這樣的:
root
+- child
+- root
+- child
+- root ....
我有什麼:
CONSTRAINT "NOT_SELF_REFERENCE" CHECK (id <> parent)
但它不檢查整個樹。
非循環樹必須改變什麼?
撤消角色對該表的更新。它應該完全使用某種功能來完成。 –
觸發器檢查'NEW.parent不在(從menupoint中選擇id,其中parent = NEW.id)'? –
@VaoTsun只檢查2個元素的循環。使用遞歸CTE可以檢測到任何循環。 - 但是簡單的觸發檢查可能會在高併發的競態條件下運行(f.ex.2同時更新可能會創建一個循環,而它們自己卻不會)。但我不確定'CONSTRAINT TRIGGER'是如何行事的(在文檔中沒有發現與他們有關的競爭條件相關的任何內容)。 – pozs