【发布时间】:2010-12-18 07:13:42
【问题描述】:
我们的系统中有一个表格,它可以从数字列中受益,因此我们可以轻松地获取工作的第一、第二、第三条记录。当然,我们可以从应用程序本身更新此列,但我希望在数据库中进行。
最终方法必须处理用户插入属于结果“中间”的数据的情况,因为他们可能会收到乱序的信息。他们也可能编辑或删除记录,因此会有相应的更新和删除触发器。
桌子:
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`seq` int(11) unsigned NOT NULL,
`job_no` varchar(20) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
还有一些示例数据:
mysql> SELECT * FROM test ORDER BY job_no, seq;
+----+-----+--------+------------+
| id | seq | job_no | date |
+----+-----+--------+------------+
| 5 | 1 | 123 | 2009-10-05 |
| 6 | 2 | 123 | 2009-10-01 |
| 4 | 1 | 123456 | 2009-11-02 |
| 3 | 2 | 123456 | 2009-11-10 |
| 2 | 3 | 123456 | 2009-11-19 |
+----+-----+--------+------------+
我希望从 at rigger 更新“seq”列,但 MySQL 不允许这样做,并出现错误“Can't update table 'test' in stored function/trigger because it has been used by statement它调用了这个存储的函数/触发器”。
我的测试触发器如下:
CREATE TRIGGER `test_after_ins_tr` AFTER INSERT ON `test`
FOR EACH ROW
BEGIN
SET @seq = 0;
UPDATE
`test` t
SET
t.`seq` = @seq := (SELECT @seq + 1)
WHERE
t.`job_no` = NEW.`job_no`
ORDER BY
t.`date`;
END;
除了记得在每次更新此表后调用一个函数之外,还有什么方法可以实现我所追求的吗?
【问题讨论】: