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