2014-03-12 57 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 ...'语句结束后丢失的';'。添加它。 –

相关问题