mysql - 关于重复的sql行,触发器

  显示原文与译文双语对照的内容

我试图定义一个触发器,该触发器要检查输入的数目特定值,并不允许使用特定行。 它引发了一个错误。 这是我的代码:


delimiter $$

CREATE TRIGGER `timeslotattendantcheck`
BEFORE INSERT ON `attendants` 
FOR EACH ROW
BEGIN
 DECLARE v_dup int; 
 SET v_dup = (SELECT COUNT(*) from attendants where attendant = NEW.attendant); 
 if v_dup> 3 then 
 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Too many attendants for one time slot. The insert is cancelled.';
 end if;
end $$

delimiter ;

时间: 作者:

5.1中不支持信号 。 你将需要升级至至少 5.5,并且已经考虑了很多时间,这样你就可以看到升级了。

如果使用 innodb,当表增大时,这个表不会缩放。 给出了innodb计数( )的nature特性,它不是像MyIASM那样快速的原子查找。 较大的表可能需要几分钟才能运行计数( ) 。 这意味着每个插入尝试都将被。

在我与 MySQL 5.1一起使用的技巧中,当某些条件满足时,会在触发器中引发错误:

  1. 创建不可插入的视图,例如:

    
    CREATE OR REPLACE VIEW no_edit_view AS
     SELECT 1 FROM dual
    
    
  2. 如果你需要引发错误,那么只需尝试将值插入这里视图:

    
    INSERT INTO no_edit_view VALUES (1);
    
    

    例如:"目标表 no_edit_view 插入不会被插入到 。"

是,错误信息不友好,但如果你无法升级MySQL服务器,则它是解决办法。


然后你的触发器:


CREATE TRIGGER `timeslotattendantcheck`
BEFORE INSERT ON `attendants` 
FOR EACH ROW
BEGIN
 DECLARE v_dup int; 
 SET v_dup = (SELECT COUNT(*) from attendants where attendant = NEW.attendant); 
 if v_dup> 3 then 
 -- SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Too many attendants for one time slot. The insert is cancelled.';
 -- workaround:
 INSERT INTO no_edit_view VALUES (1);
 end if;
end $$

作者:
...