2009-04-21 49 views
0

據我所知,在SQLite 3中沒有直接的外鍵約束能力。我有一個多對多的表需要它, m創建一個觸發器,當外鍵約束被違反時引發一個ABORT。我的發言是這樣的:如何在sqlite3上的多個鍵上創建觸發器

CREATE TRIGGER fkFooBar 
    BEFORE INSERT ON Foo_Bar 
    FOR EACH ROW BEGIN 
    SELECT RAISE (ABORT, 'Insert on Foo_Bar violates foreign key') 
    WHERE ((SELECT id as fId FROM FOO WHERE fId = NEW.fooId) IS NULL) || ((SELECT id as bId FROM BAR WHERE bId = NEW.barId) IS NULL); 
    END; 

但這僅限制在barId存在,而不是fooId。我只是模糊地熟悉SQL,之前沒有處理觸發器,所以我在這方面有點失落。爲什麼這不起作用?我是否以這種錯誤的方式去做?這應該更簡單嗎? (即在一條SELECT語句中)

回答

0

既然誰也居然回答問題我問:

||在sqlite中不是二進制OR。只需使用一個|

0

請注意。

觸發器通常是一個壞主意。你已經發現了觸發器往往是一個錯誤的另一個原因。

主要原因是觸發器將您的編程分成兩部分。該代碼是代碼 - 易於查找和維護 - 以及隱藏在數據庫中的代碼,更難以查找和維護。

如果確實很難做到,那麼您使用的是錯誤的工具。

+0

那麼什麼是正確的工具? – 2009-04-21 15:36:59

相關問題