Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQLite触发器中止以下语句_Sql_Sqlite_Triggers - Fatal编程技术网

从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;
可能重复的