我想表達:
“禁止在插入后插入具有未包含在 'rowid' 中的 'parent' 值的記錄。”
我的目的是保持表作為有向無環圖在內部保持一致,每個記錄都是一個節點,參考其父節點(根節點是它們自己的父節點)。我怎樣才能做到這一點?
這是我所擁有的(使用 rowid 作為主鍵):
CREATE TABLE Heap (
name TEXT CHECK(typeof(name) = 'text')
NOT NULL
UNIQUE ,
parent INTEGER DEFAULT rowid ,
color INTEGER CHECK(color BETWEEN 0 AND 2)
);
CREATE TRIGGER parent_not_in_rowid
BEFORE INSERT ON Heap
BEGIN
SELECT RAISE(FAIL, 'parent id inconsistent') FROM Heap
WHERE NOT EXISTS(SELECT 1 FROM Heap WHERE NEW.rowid = NEW.parent);
END;
uj5u.com熱心網友回復:
我建議null在parent根節點的列中使用值,因為這樣你所要做的就是向你的表添加參照完整性。
添加一個id定義為的列INTEGER PRIMARY KEY,使其成為 的別名rowid并使該列parent參考id:
CREATE TABLE Heap (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE CHECK(typeof(name) = 'text'),
parent INTEGER REFERENCES Heap(id),
color INTEGER CHECK(color BETWEEN 0 AND 2)
);
現在,打開外鍵支持:
PRAGMA foreign_keys = ON;
并插入行:
INSERT INTO Heap (name, parent, color) VALUES ('name1', null, 1);
INSERT INTO Heap (name, parent, color) VALUES ('name2', 1, 1);
這將失敗:
INSERT INTO Heap (name, parent, color) VALUES ('name3', 5, 2);
因為表中沒有帶有id = 5.
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/368724.html
