如何在MySql触发器中中止INSERT操作?

joh*_*nrl 31 mysql triggers duplicates

我有一个包含url的表和一个表示其参数的字符串.问题是我想要一个url和一个参数字符串作为表的唯一约束 - 也就是说没有条目可以具有相同的url和参数字符串.参数字符串可以是任意长度(比800bytes长左右这是一个MySQL的关键最大长度,所以因为它抛出一个错误,我不能用独有的(URL,则params)...).

我考虑使用触发器来执行此操作,但如果触发器发现插入即将插入重复条目,如何抛出异常/引发错误?我想我想抛出MySqlException,就像MySql一样,重复主键等,所以我可以用我的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
Run Code Online (Sandbox Code Playgroud)

Gaz*_*azB 71

我偶然发现了这个问题,虽然解决方案有效,但后来我发现了一种更好的解决方案.我怀疑在最初回答这个问题时这不是一个选择.

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$$
Run Code Online (Sandbox Code Playgroud)

现在,这将返回一个可以捕获的错误(或邪恶!)错误消息.有关详细信息,请参阅:http://dev.mysql.com/doc/refman/5.5/en/signal.html

我希望这有助于其他人!

  • 这真是太神奇了.为我工作. (2认同)

sou*_*rge 8

关于触发器的mysql文档中注释表明mysql中没有这样的功能.您可以做的最好的事情是为您的触发器错误创建一个单独的表,如同一页上所示.


g33*_*z0r 6

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