当前位置: 首页 > 面试题库 >

从SQLite触发器中止以下语句

孟英锐
2023-03-14
问题内容

我想创建一个类似于此的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

第一个INSERT将产生两个新记录(在表users和中unique_emails),而第二个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;


 类似资料:
  • 主要内容:语法,实例,列出触发器(TRIGGERS),删除触发器(TRIGGERS)SQLite 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。以下是关于 SQLite 的触发器(Trigger)的要点: SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。 SQLite 只支持 FOR EACH ROW 触发器(Trigger

  • 在我的OS/400V6中。x系统我使用ADDPFTRG命令为物理文件(DB2表)创建了一个插入后触发器,每当我在RPG IV程序上执行写命令或从STRSQL生成INSERT语句时,该命令都会正确触发,但当我使用JT400(JTOpen)JDBC驱动程序从Java程序执行INSERT语句时,触发器不会触发。 在这两种情况下(从OS400和从Java),都会成功插入记录,但只有从OS400插入记录时才

  • 问题内容: 我想创建一个触发器,以防止在出生日期(列之一)将来的时候插入。我有这个: 如何取消if语句中的插入? 问题答案: 基于这一点,我不确定是否可以这样做。 MySQL当前的触发器实现中不支持自愿引发异常并中止生成触发器的语句。 我发现的解决方法是编写一个BEFORE触发器,以将表中的not-NULL列之一设置为NULL,从而违反了其NOT NULL约束。这导致产生触发器的语句被中止。

  • 我写了这个触发器,但它不工作,我执行了这个错误: 11:24:11创建触发器check_venduti在INSERT ON venduti之后,对每一行开始SELECT count(*)作为num_rows FROM prodotto(其中COD_PRODOTTO=New.COD_PRODOTO如果numrows<0,则发出“Error”信号,结束错误代码:1064)。您的SQL语法有错误;检查与

  • 问题内容: 每当我从表Y获得任何记录时,我都试图在表X上运行一条语句,无论如何,我只能使用MySQL来完成该操作吗? 像触发器一样? 问题答案: 简短的回答是第触发器触发与,或。 可能的解决方案。相当罕见的情况: 首先,在表X上编写一些执行所需操作的存储过程。 然后,限制所有用户仅使用这些存储过程,并且不允许他们直接在表X上使用。 然后,更改存储过程以也调用执行所需操作(或其他操作)的存储过程。

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?