我們在我們的系統中的表將受益於數字列,所以我們可以很容易地搶了第一,第二,第三的作業記錄。當然,我們可以從應用程序本身更新本專欄,但我希望能夠在數據庫中完成。是否可以在MySQL的觸發器中更新「訂單」列?
最後一種方法必須處理,用戶插入屬於在結果的「中間」,因爲它們可以接收信息不按順序的數據的情況。他們也可能編輯或刪除記錄,所以會有相應的更新和刪除觸發器。
表:
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 |
+----+-----+--------+------------+
我希望能更新從裝配工的「序列」一欄,但這不是由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;
有什麼辦法來實現我比記住每次更新此表格後調用函數等之後我?
這不會處理他們插入一條記錄外的順序,我忘了說是一個要求的情況。 用戶可能會收到的數據不按順序,所以我們需要在日期字段秩序,確保不存在任何差距,如果他們刪除/更新記錄,太!很奇怪,但我無法想象「序列」字段是非常罕見的。 – Drarok 2009-11-19 13:29:48
然後據我知道這是不可能的,因爲它是一個MySQL的限制(http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html):「在存儲函數或觸發器,不允許修改調用該函數或觸發器的語句已經在使用(用於讀取或寫入)的表。「 – Sergi 2009-11-19 13:48:52