【问题标题】:Is it possible to update an "order" column from within a trigger in MySQL?是否可以从 MySQL 的触发器中更新“订单”列?
【发布时间】: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;

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

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    这个怎么样?

    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;
    

    【讨论】:

    • 这不会处理他们插入乱序记录的情况,我忘了提到这是一个要求。用户可能会收到乱序的数据,所以我们需要按日期字段排序,并确保他们删除/更新记录时也没有间隙!很奇怪,但我无法想象“序列”字段如此罕见。
    • 那么据我所知这是不可能的,因为这是 MySQL 的限制(dev.mysql.com/doc/refman/5.1/en/…):“在存储的函数或触发器中,不允许修改已经被使用的表(用于读取或写入)由调用函数或触发器的语句。”
    【解决方案2】:

    来自 Sergi 上面的评论:

    http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html - “在存储的函数或触发器中,不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2012-01-21
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      相关资源
      最近更新 更多