从SQLite触发器中止以下语句
我想创建一个类似于此的:从SQLite触发器中止以下语句,sql,sqlite,triggers,Sql,Sqlite,Triggers,我想创建一个类似于此的: CREATE TRIGGER "prevent_duplicate_emails" BEFORE INSERT OF "email" ON "users" FOR EACH ROW BEGIN SELECT COUNT("email") FROM "users" WHERE "email" LIKE NEW."email" # FIX ME! IF COUNT("email") > 0: RAISE ABORT|FAIL,
CREATE TRIGGER "prevent_duplicate_emails"
BEFORE INSERT OF "email" ON "users"
FOR EACH ROW
BEGIN
SELECT COUNT("email") FROM "users" WHERE "email" LIKE NEW."email"
# FIX ME!
IF COUNT("email") > 0:
RAISE ABORT|FAIL, NEW."email" || ' already exists'
ELSE:
INSERT INTO "unique_emails" VALUES (NEW."email");
ENDIF;
END;
所以基本上当我这样做的时候:
INSERT INTO "users" ("email") VALUES ("adam@eden.com"); # WORKS
INSERT INTO "users" ("email") VALUES ("adam@eden.com"); # FAILS
INSERT INTO "users" ("email") VALUES ("eve@eden.com"); # WORKS
第一个INSERT
将生成两条新记录(在表users
和unique\u email
中),而第二个INSERT
将失败,根本不会生成任何记录。是否可以通过触发器执行此操作
我阅读了文档,但除了没有完全理解RAISE
之外,我没有找到实现这一点的方法
PS:我知道我可以采取其他几种方法来获得独特电子邮件的列表,但这不是问题的重点。如果我可以在触发器中执行此检查/中止操作,事情会变得非常简单。答案:
CREATE TRIGGER IF NOT EXISTS "prevent_duplicate_emails"
BEFORE INSERT OF "email" ON "users"
FOR EACH ROW
BEGIN
SELECT RAISE(ABORT, 'Email already exists.')
WHERE EXISTS (SELECT 1 FROM "unique_emails"
WHERE "email" LIKE NEW."email");
INSERT INTO "unique_emails" VALUES (NEW."email");
END;
可能重复的