插入不工作后mysql触发器

时间:2014-12-13 15:22:00

标签: mysql triggers

我尝试了几个例子,无法实现我的目标 - 所以我在这里问......

我有一张桌子: 表格1 列:col1,col2

我想在插入后更改col2: 如果(col2 = 0)那么    将col2改为max(col2)+ 1 其他    保持价值不变 感谢

2 个答案:

答案 0 :(得分:2)

您需要在插入之前使用,因为在插入之前,您可以检查col2是否为0,然后将值设置为max col2 + 1

这是一种方法

delimiter //
create trigger test_ins before insert on table1
for each row 
begin
  declare max_col2 int;
  if new.col2 = 0 then
    set max_col2 = (select max(col2) from table1);
  end if ;
  if max_col2 is null then
    set new.col2 = 1 ;
  else 
    set new.col2 = max_col2 + 1 ;
  end if ;
end ;//
delimiter ;

请注意,在上面的触发器中,我添加了一个检查,如果max(col2)为null,当您将表中的第一条记录添加到col2为0时,我将其设置为1

if max_col2 is null then
        set new.col2 = 1 ;

您可以根据需要进行设置。

这是一个测试用例

mysql> create table table1 (col1 int, col2 int);
Query OK, 0 rows affected (0.13 sec)

mysql> delimiter //
mysql> create trigger test_ins before insert on table1
    -> for each row 
    -> begin
    ->   declare max_col2 int;
    ->   if new.col2 = 0 then
    ->     set max_col2 = (select max(col2) from table1);
    ->   end if ;
    ->   if max_col2 is null then
    ->     set new.col2 = 1 ;
    ->   else 
    ->     set new.col2 = max_col2 + 1 ;
    ->   end if ;
    -> end ;//
Query OK, 0 rows affected (0.10 sec)


mysql> delimiter ;

mysql> insert into table1 values (1,0);
Query OK, 1 row affected (0.04 sec)

mysql> select * from table1;
+------+------+
| col1 | col2 |
+------+------+
|    1 |    1 |
+------+------+
1 row in set (0.00 sec)

mysql> insert into table1 values (2,0);
Query OK, 1 row affected (0.04 sec)

mysql> select * from table1;
+------+------+
| col1 | col2 |
+------+------+
|    1 |    1 |
|    2 |    2 |
+------+------+
2 rows in set (0.00 sec)

答案 1 :(得分:0)

再次 - 感谢您的回复。

然而,我测试了它,似乎:

  1. 不要将+ 1添加到下一个值(我真的不知道为什么会这样)。
  2. 保留值(如果已定义)(我在上面写道:“否则保留值”)
  3. 我改变了你的代码并添加了一些额外的IF。 现在它工作正常(对我而言)。

    DELIMITER //
    CREATE TRIGGER trigCF7Submits 
    BEFORE INSERT ON wp_cf7dbplugin_submits
    
    FOR EACH ROW 
    BEGIN
      DECLARE nMaxInternalNumber INT;
    
       IF ((new.form_name='ActionForm') AND (new.field_name='txtActionFormInternalNumber')) then
          IF (new.field_value = 0) THEN
             SET nMaxInternalNumber = (SELECT max(field_value) FROM wp_cf7dbplugin_submits WHERE ((form_name='ActionForm') AND (field_name='txtActionFormInternalNumber')));         
    
             IF (nMaxInternalNumber IS NULL) THEN
                SET nMaxInternalNumber = 0;
             END IF;
    
             SET nMaxInternalNumber = nMaxInternalNumber + 1;
          ELSE
             SET nMaxInternalNumber = new.field_value;
          END IF;
    
          SET new.field_value = nMaxInternalNumber ;
        END IF ;
    END ;//
    DELIMITER ;