触发重复的sql行

时间:2014-10-20 19:56:44

标签: mysql sql triggers

我正在尝试定义一个触发器,该触发器将检查特定值的条目数,如果该数字大于3,则禁止输入该特定行的新行。但它会抛出错误。 这是我的代码:

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 ;

2 个答案:

答案 0 :(得分:0)

5.1中不支持

SIGNAL。你需要升级到至少5.5,而且5.6已经考虑了很长一段时间,所以你可能会考虑升级到那个。

如果你使用innodb,如果表变大,这个表将无法扩展。鉴于innodb计数()的MVCC性质不是MyIASM中的快速原子查找。更大的表可能需要几分钟才能运行计数()。这意味着每次插入尝试都将受到限制。

答案 1 :(得分:0)

我在MySQL 5.1中使用的技巧在满足某些条件时引发触发错误:

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

    CREATE OR REPLACE VIEW no_edit_view AS
      SELECT 1 FROM dual
    
  2. 如果您需要引发错误,请尝试在此视图中插入值:

    INSERT INTO no_edit_view VALUES (1);
    

    你得到的错误如下:“ INSERT的目标表no_edit_view无法插入

  3. 是的,错误消息不友好,但如果您无法升级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 $$