gpt4 book ai didi

sql - 中止来自 SQLite 触发器的以下语句

转载 作者:行者123 更新时间:2023-12-03 17:09:21 25 4
gpt4 key购买 nike

我想创建一个 SQLite trigger类似于这个:

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 将生成两条新记录(在表 usersunique_emails 中),而第二个 INSERT 将失败并且根本不生成任何记录。是否可以通过触发器执行此操作?

我阅读了文档,但除了不完全理解 RAISE 之外,我看不到实现此目的的方法。

PS:我知道我可以采用其他几种方法来获取独特电子邮件的列表,但这不是这个问题的重点。如果我可以在触发器内执行此检查/中止,那真的会简化事情。

最佳答案

Found答案:

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;

关于sql - 中止来自 SQLite 触发器的以下语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com