2014-03-12 85 views
8

想象一下,我有這些字段的MySQL表(tbl_test):id,標題,優先級
id會自動遞增。我需要填寫優先級字段,其​​值與插入後的id字段相同。
由於我是使用MySQL觸發器的新手,請告訴我必須爲它寫些什麼。我做了一些事情,但我認爲這不是事實:使用MySQL觸發器插入新記錄後的更新表列

CREATE TRIGGER 'test' AFTER INSERT ON `tbl_test` 
BEGIN 
    SET new.priority = new.id; 
END 

感謝您的協助。

+0

我不認爲你可以做到這一點。 'AFTER INSERT'觸發器不能修改同一個表,既不通過發佈更新 –

+0

您的解決方案@AbdulManaf是什麼? –

+0

加我的回答 –

回答

1

我不認爲你可以做到這一點。一個AFTER INSERT觸發器不能修改同一個表,既不通過發出UPDATE也不由這樣的事情:

DROP TRIGGER new_tbl_test; 

DELIMITER $$ 

CREATE TRIGGER new_tbl_test 
AFTER INSERT ON tbl_test for each row 
begin 
UPDATE tbl_test SET priority = new.id WHERE id = new.id; 
END $$ 

DELIMITER ; 

它給像

ERROR 1442 (HY000): Can't update table 'tbl_test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

你能做什麼錯誤,是使用事務:

實施例:表結構是像下面

mysql> show create table tbl_test\G 
*************************** 1. row *************************** 
     Table: tbl_test 
Create Table: CREATE TABLE `tbl_test` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `title` char(30) DEFAULT NULL, 
    `priority` int(11) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

交易

START TRANSACTION ; 
    INSERT INTO tbl_test (title) 
    VALUES ('Dr'); 
    UPDATE tbl_test 
    SET `priority` = id 
    WHERE id = LAST_INSERT_ID(); 
COMMIT ; 

檢查數據

mysql> SELECT * FROM tbl_test; 
+----+-------+----------+ 
| ID | title | priority | 
+----+-------+----------+ 
| 1 | Dr |  1 | 
+----+-------+----------+ 
1 row in set (0.00 sec) 
+0

我想用Triggers –

14

您嘗試值設置爲一列的方式是更新。因爲你在做之後插入操作完成。

您實際上需要一個before觸發器。

並且爲同一表的主鍵列分配相同的新自動增量值,最好從information_schema.tables得到它。

delimiter // 
drop trigger if exists bi_table_name // 

create trigger bi_table_name before insert on table_name 
for each row begin 
    set @auto_id := (SELECT AUTO_INCREMENT 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME='table_name' 
         AND TABLE_SCHEMA=DATABASE()); 
    set new.priority= @auto_id; 
end; 
// 

delimiter ; 

: 確保你沒有使用相同的名稱和/或行動的任何預先定義的觸發器。 如果有一些,然後在創建新的之前刪除它們。

+0

當我想運行你的代碼時,得到語法錯誤 –

+0

@MohammadBagherSaberi:什麼是錯誤信息? –

+0

必須是第一個'set ...'語句結束後丟失的';'。添加它。 –

相關問題