mysql - 如何中止 MySql 触发器中的 INSERT 操作?

标签 mysql triggers duplicates

我有一个表,其中包含一个 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

最佳答案

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

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

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

关于mysql - 如何中止 MySql 触发器中的 INSERT 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2538786/

相关文章:

php - 如何在 codeigniter 中显示带有数据库中选定值的复选框列表

mysql - 如何从第二表和第三表中进行选择并根据交易日期对数据进行分组

php - fetch_assoc 的排序

oracle - oracle中的触发器

PHP - 删除具有相同引用的重复值

mysql - 如何使用关系代数从数据库中获取冗余一致(重复)数据?

mysql - 哪个 Maven 阶段将始终在测试阶段之后执行?

c# - 简单的数据触发器不起作用。为什么?

mysql - 与 MySQL 触发器作斗争

mysql - SQLSTATE[23000] : Integrity constraint violation: 1062 Duplicate entry '2' for key 'PRIMARY'