2009-11-19 69 views
2

我們在我們的系統中的表將受益於數字列,所以我們可以很容易地搶了第一,第二,第三的作業記錄。當然,我們可以從應用程序本身更新本專欄,但我希望能夠在數據庫中完成。是否可以在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; 

有什麼辦法來實現我比記住每次更新此表格後調用函數等之後我?

回答

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

這不會處理他們插入一條記錄外的順序,我忘了說是一個要求的情況。 用戶可能會收到的數據不按順序,所以我們需要在日期字段秩序,確保不存在任何差距,如果他們刪除/更新記錄,太!很奇怪,但我無法想象「序列」字段是非常罕見的。 – Drarok 2009-11-19 13:29:48

+1

然後據我知道這是不可能的,因爲它是一個MySQL的限制(http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html):「在存儲函數或觸發器,不允許修改調用該函數或觸發器的語句已經在使用(用於讀取或寫入)的表。「 – Sergi 2009-11-19 13:48:52

相關問題