【问题标题】:How to abort INSERT operation in MySql trigger?如何中止 MySql 触发器中的 INSERT 操作?
【发布时间】:2010-03-29 14:45:29
【问题描述】:

我有一个表,其中包含一个 url 和一个表示其参数的字符串。问题是我希望一个 url 和一个参数字符串成为表的唯一约束 - 也就是没有条目可以具有相同的 url 和参数字符串。参数字符串可以是任意长度(超过 800 字节左右,这是 MySql 键的最大长度,所以我不能使用 Unique(url, params),因为它会引发错误......)。

我考虑过使用触发器来执行此操作,但是如果触发器发现插入即将插入重复条目,我该如何抛出异常/引发错误?我想我想像 MySql 那样使用重复的主键等抛出一个 MySqlException,这样我就可以在我的 C# 代码中捕获它。

触发器中有两部分需要帮助: ... 中止向 C# 抛出异常 ... 如何向 C# 抛出异常等? ... 允许插入 ... - 如果没有重复条目,我如何只允许插入?

触发代码如下:

CREATE TRIGGER urls_check_duplicates
BEFORE INSERT ON urls
FOR EACH ROW

BEGIN
DECLARE num_rows INTEGER;

SELECT COUNT(*)
INTO num_rows
FROM urls
WHERE url = NEW.url AND params = NEW.params;

IF num_rows > 0 THEN
   ... ABORT/throw exception to C# ...
ELSE
   ... Allow insert ...
END

【问题讨论】:

标签: mysql triggers duplicates


【解决方案1】:

我遇到了这个问题,虽然解决方案有效,但我后来发现我觉得这是一个更好的解决方案。我怀疑在最初回答这个问题时这不是一个选项。

CREATE TRIGGER `TestTable_SomeTrigger`
BEFORE UPDATE ON `test_table`
FOR EACH ROW
BEGIN
    DECLARE msg VARCHAR(255);
    IF (SomeTestToFail = "FAIL!") THEN
        set msg = "DIE: You broke the rules... I will now Smite you, hold still...";
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
    END IF;

    -- Do any other code here you may want to occur if it's all OK or leave blank it will be
    --  skipped if the above if is true
END$$

这将返回一个不错的(或邪恶的!)错误消息,您可以捕获它。 有关这方面的更多信息,请参阅:http://dev.mysql.com/doc/refman/5.5/en/signal.html

我希望这对其他人有帮助!

【讨论】:

  • 这真是太棒了。为我工作。
  • 谢谢。我需要一个表格并强制执行不重叠的范围,这使我能够做到。
【解决方案2】:

comments in the mysql documentation about triggers 提示mysql中没有这个功能。您可以做的最好的事情是为您的触发器错误创建一个单独的表,as suggested on the same page

【讨论】:

    【解决方案3】:

    如果您的表定义是一个 NOT NULL 值,您可以将 NEW 设置为 NULL,这实际上不会执行插入操作。您可能必须打开严格的 sql 模式才能正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2017-04-10
      • 2021-02-09
      • 2016-02-16
      相关资源
      最近更新 更多