3

次のようなSQLite トリガーを作成したいと思います。

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

1つ目INSERTは 2 つの新しいレコード (表usersおよび内unique_emails) を生成しますが、2 つ目INSERTは失敗し、レコードをまったく生成しません。トリガーからこれを行うことは可能ですか?

私はドキュメントを読みましたが、完全に理解RAISEしていないだけでなく、これを達成する方法がわかりません。

PS : 一意の電子メールのリストを取得するために、他のいくつかの方法を使用できることはわかっていますが、それはこの質問のポイントではありません。トリガー内からこのチェック/中止を行うことができれば、物事は本当に簡単になります。

4

1 に答える 1

2

答えを見つけました:

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;
于 2013-06-03T21:53:43.110 に答える