Mysql触发器问题

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()

我没有测试过,你自己测试一下再说,基本上应该没问题

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网