CREATE TRIGGER `STA_CTY` BEFORE INSERT ON `station` FOR EACH ROW
select `city_name` into @a from `inserted`; insert into `city` (`city_name`) values(@a)
where not exists( select `city`.city_name from `inserted`,`city` where `inserted`.city_name = `city`.city_name )
提示出错#1235 - This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
请问是哪里的问题
第1个回答 2014-05-30
楼上的写的都SQL Server支持的语法
MySQL中不是这样写滴
如下:
CREATE TRIGGER trg_Table1
AFTER insert ON `Table1`
FOR EACH ROW
BEGIN
INSERT INTO dede_addonarticle(id,typeid,body)
SELECT id,typeid,description
FROM dede_archives
WHERE id=LAST_INSERT_ID()
END;
在这里最麻烦的是取得自增量最后插入的值,根据MySQL的官方说明,是使用LAST_INSERT_ID()这个函数,LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。
一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。
但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。
这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。
用MySQL命令行测试,结果是正确的,但是使用MySQL Query Browser测试时,LAST_INSERT_ID返回了全部的id值。可能是软件的问题,跟MySQL无关。
另外,如果你有一次有多行记录插入时,LAST_INSERT_ID只返回第1个,
例如:
INSERT INTO dede_archives(typeid,description)
VALUES (222, 'Mary') , (333, 'Jane') , (444, 'Lisa');
一次插入3行记录,假设此时生成的id是4,5,6三个,但是用LAST_INSERT_ID只能返回4
因此,对于批量插入时的处理,你要结合使用ROW_COUNT()来判断插入的记录数
INSERT INTO dede_addonarticle(id,typeid,body)
SELECT id,typeid,description
FROM dede_archives
WHERE id>=LAST_INSERT_ID()
AND id <=LAST_INSERT_ID()+ROW_COUNT()
我没有测试过,你自己测试一下再说,基本上应该没问题
MySQL中不是这样写滴
如下:
CREATE TRIGGER trg_Table1
AFTER insert ON `Table1`
FOR EACH ROW
BEGIN
INSERT INTO dede_addonarticle(id,typeid,body)
SELECT id,typeid,description
FROM dede_archives
WHERE id=LAST_INSERT_ID()
END;
在这里最麻烦的是取得自增量最后插入的值,根据MySQL的官方说明,是使用LAST_INSERT_ID()这个函数,LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。
一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。
但在多线程情况下,就不行了。在多用户交替插入数据的情况下max(id)显然不能用。
这就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。
用MySQL命令行测试,结果是正确的,但是使用MySQL Query Browser测试时,LAST_INSERT_ID返回了全部的id值。可能是软件的问题,跟MySQL无关。
另外,如果你有一次有多行记录插入时,LAST_INSERT_ID只返回第1个,
例如:
INSERT INTO dede_archives(typeid,description)
VALUES (222, 'Mary') , (333, 'Jane') , (444, 'Lisa');
一次插入3行记录,假设此时生成的id是4,5,6三个,但是用LAST_INSERT_ID只能返回4
因此,对于批量插入时的处理,你要结合使用ROW_COUNT()来判断插入的记录数
INSERT INTO dede_addonarticle(id,typeid,body)
SELECT id,typeid,description
FROM dede_archives
WHERE id>=LAST_INSERT_ID()
AND id <=LAST_INSERT_ID()+ROW_COUNT()
我没有测试过,你自己测试一下再说,基本上应该没问题