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