我正在尝试创建一个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:
有什么想法吗?这是我第一次使用触发器...
答案 0 :(得分:1)
您正在执行after insert
并且无法在触发器中更新同一个表。因此,您可能需要使用before insert
并且不能直接为另一列设置auto_incremented主键值。
after insert
触发意味着插入已经发生,您可以在使用new
和old
关键字插入之前使用插入的值或值。在您的情况下,您希望使用触发器中的主键值和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)