2009-04-21 83 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