据我所知,没有直接的能力在SQLite 3中有外键约束。我有一个需要这个的多对多表,所以我创建了一个触发器,当外来时引发ABORT违反了键约束。我的陈述如下:
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 :(得分:0)
接受提示。
触发通常是一个坏主意。你已经发现了触发器经常出错的另一个原因。
主要原因是触发器将您的编程分为两部分。代码 - 代码 - 易于查找和维护 - 以及隐藏在数据库中的代码,更难以查找和维护。
如果真的很难,那你就是使用了错误的工具。
答案 1 :(得分:0)
由于没有其他人真正回答问题我问:
||在sqlite中不是二进制OR。只需使用单个|