MySQL触发器语法

时间:2014-12-10 14:09:51

标签: mysql triggers

我正在尝试创建一个MySQL触发器来复制自动增量列。

自动增量列称为“iBmsId”,重复列仅称为“id”。

这是我的查询:

CREATE TRIGGER t_bms_ID_Update AFTER INSERT ON t_bms SET id = iBmsId

我在SQL小提琴中遇到以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET id = iBmsId' at line 1:

有什么想法吗?这是我第一次使用触发器...

1 个答案:

答案 0 :(得分:1)

您正在执行after insert并且无法在触发器中更新同一个表。因此,您可能需要使用before insert并且不能直接为另一列设置auto_incremented主键值。

after insert触发意味着插入已经发生,您可以在使用newold关键字插入之前使用插入的值或值。在您的情况下,您希望使用触发器中的主键值和after insert模仿其他列值,但您可以轻松地将插入的主键值设为new.iBmsId,但您无法更新同一个表。因此,如果您希望使用触发器,则需要before insert

这是你怎么做的

delimiter //
create trigger t_bms_ID_Update before insert on t_bms 
for each row
 begin
  SET new.id = (select iBmsId from t_bms order by iBmsId DESC LIMIT 1) + 1;
end ;//

delimiter ;

现在如果你的表是空的并且你是第一次插入然后使用上面的触发器你可能会得到id值为null所以上面的更好的版本来处理它将是< / p>

delimiter //
create trigger t_bms_ID_Update before insert on t_bms 
for each row
 begin
  declare new_id int;
  SET new_id = (select iBmsId from t_bms order by iBmsId DESC LIMIT 1) + 1;
  if new_id is null then
   set new_id = 1;
  end if ;
  set new.id = new_id ;
end ;//

delimiter ;

这是一个测试用例,

mysql> create table test (id int, mimic int);
Query OK, 0 rows affected (0.15 sec)


mysql> delimiter //
mysql> create trigger test_ins before insert on test
    -> for each row 
    ->  begin
    ->  declare new_mimic int;
    ->  set new_mimic = (select id from test order by id desc limit 1) + 1 ;
    ->  if new_mimic is null then 
    ->   set new_mimic = 1 ;
    ->  end if;
    ->  set new.mimic = new_mimic;
    -> end ;//
Query OK, 0 rows affected (0.08 sec)

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

mysql> select * from test ;
+------+-------+
| id   | mimic |
+------+-------+
|    1 |     1 |
+------+-------+
1 row in set (0.00 sec)

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

mysql> select * from test ;
+------+-------+
| id   | mimic |
+------+-------+
|    1 |     1 |
|    2 |     2 |
+------+-------+
2 rows in set (0.00 sec)