gpt4 book ai didi

sql - 是否可以从 MySQL 的触发器中更新 "order"列?

转载 作者:行者123 更新时间:2023-11-29 02:38:02 25 4
gpt4 key购买 nike

我们的系统中有一个表,该表将受益于数字列,因此我们可以轻松获取作业的第 1、2、3 条记录。当然,我们可以从应用程序本身更新此列,但我希望在数据库中执行此操作。

final 方法必须处理用户插入属于​​结果“中间”的数据的情况,因为他们可能会乱序接收信息。他们也可能编辑或删除记录,因此会有相应的更新和删除触发器。

表格:

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 |
+----+-----+--------+------------+

我希望从触发器更新“seq”列,但 MySQL 不允许这样做,并出现错误“无法更新存储函数/触发器中的表‘test’,因为它已被语句使用它调用了这个存储的函数/触发器。

我的测试触发器如下:

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;

除了记住每次更新此表后调用一个函数之外,还有什么方法可以实现我所追求的目标吗?

最佳答案

这个呢?

CREATE TRIGGER `test_after_ins_tr` BEFORE INSERT ON `test`
FOR EACH ROW
BEGIN
SET @seq = (SELECT COALESCE(MAX(seq),0) + 1 FROM test t WHERE t.job_no = NEW.job_no);
SET NEW.seq = @seq;
END;

关于sql - 是否可以从 MySQL 的触发器中更新 "order"列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com