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

我有一个表包含一个URL和一个string表示其参数。 问题是我想要一个url和一个参数string是表的唯一约束 – 又没有条目可以有相同的URL和参数string。 参数string可以是任意长度(长度大于800bytes,这是MySql键的最大长度,所以我不能使用Unique(url,params),因为它会引发错误…)。

我想过使用触发器来做到这一点,但是如果触发器发现插入操作将要插入重复条目,我该如何抛出exception/引发错误? 我想我想有一个MySqlException抛出像MySql重复的主键等,所以我可以在我的C#代码捕获它。

我在触发器中有两件我需要得到的帮助:…中止抛出exception到C#…如何抛出exception等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文档中有关触发器的注释表明在mysql中没有这样的function。 您可以做的最好的做法是为您的触发器错误创build一个单独的表, 如同一页上所build议的 。

我遇到了这个,虽然解决scheme的工作,我后来碰到什么感觉像一个更好的解决scheme。 当我回答这个问题时,我怀疑这不是一种select。

 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

我希望这可以帮助别人!

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