概述: 我有一個父/子表關係,那裏的孩子可能包含2:n條記錄與FK的回父。 當試圖從父項中刪除時,我得到一個SQLITE_CONSTRAINT錯誤。這是意外的,因爲我已啓用FK,讓孩子註冊ON DELETE CASCADE
,並有足夠新的SQLite版本。SQLite的外鍵,ON DELETE CASCADE和SQLITE_CONSTRAINT
然而:我的孩子表原本沒有ON DELETE CASCADE
。數據添加到父/子後,我添加了(並啓用了FK)。從那裏,我改名爲原來的孩子&用約束創建了一個新表,最後移到了新表中。
表佈局如下:
CREATE TABLE IF NOT EXISTS message (
message_id INTEGER PRIMARY KEY,
area_tag VARCHAR NOT NULL,
message_uuid VARCHAR(36) NOT NULL,
reply_to_message_id INTEGER,
to_user_name VARCHAR NOT NULL,
from_user_name VARCHAR NOT NULL,
subject, /* FTS @ message_fts */
message, /* FTS @ message_fts */
modified_timestamp DATETIME NOT NULL,
view_count INTEGER NOT NULL DEFAULT 0,
UNIQUE(message_uuid)
);
CREATE INDEX IF NOT EXISTS message_by_area_tag_index
ON message (area_tag);
CREATE VIRTUAL TABLE IF NOT EXISTS message_fts USING fts4 (
content="message",
subject,
message
);
CREATE TRIGGER IF NOT EXISTS message_before_update BEFORE UPDATE ON message BEGIN
DELETE FROM message_fts WHERE docid=old.rowid;
END;
CREATE TRIGGER IF NOT EXISTS message_before_delete BEFORE DELETE ON message BEGIN
DELETE FROM message_fts WHERE docid=old.rowid;
END;
CREATE TRIGGER IF NOT EXISTS message_after_update AFTER UPDATE ON message BEGIN
INSERT INTO message_fts(docid, subject, message) VALUES(new.rowid, new.subject, new.message);
END;
CREATE TRIGGER IF NOT EXISTS message_after_insert AFTER INSERT ON message BEGIN
INSERT INTO message_fts(docid, subject, message) VALUES(new.rowid, new.subject, new.message);
END;
CREATE TABLE IF NOT EXISTS message_meta (
message_id INTEGER NOT NULL,
meta_category INTEGER NOT NULL,
meta_name VARCHAR NOT NULL,
meta_value VARCHAR NOT NULL,
UNIQUE(message_id, meta_category, meta_name, meta_value),
FOREIGN KEY(message_id) REFERENCES message(message_id) ON DELETE CASCADE
);
在啓動時,連接到數據庫的I確保FK的啓用後直接:
PRAGMA foreign_keys = ON;
其他詳情:
- SQLite的版本: 3.7.17
- 訪問:node-sqlite3
- 確切錯誤:
Error: SQLITE_CONSTRAINT: FOREIGN KEY constraint failed
這是造成我後來添加的約束的事實?
(請參閱更新1) 如何修復此問題而不丟失數據?
更新1:
我可以確認,僅選擇消息(我相信,作爲加入到該message_meta均消息之前ON DELETE CASCADE
消息)導致約束錯誤。其他人刪除得很好,並正確地取出相關的message_meta記錄。
顯示實際的錯誤信息。 –
@CL:錯誤:SQLITE_CONSTRAINT:FOREIGN KEY約束失敗(也更新了OP) – NuSkooler
適用於我。你確定你已經顯示的是數據庫的當前模式嗎? –