使用MySQL触发器插入新记录后更新表列

Moh*_*eri 13 mysql triggers insert sql-update

想象一下,我有一个MySQL表(tbl_test),其中包含以下字段:id,title,priority.
id将自动递增.我需要在插入后使用与id字段相同的值填充优先级字段. 由于我是使用MySQL触发器的新手,请告诉我我要为它编写的内容.我做了一些事情,但我认为这不是真的:

CREATE TRIGGER 'test' AFTER INSERT ON `tbl_test`
BEGIN
   SET new.priority = new.id;
END
Run Code Online (Sandbox Code Playgroud)

谢谢你的协助.

Rav*_*ddy 17

您尝试将值设置为列的方式是更新.因为您在插入操作完成正在执行此操作.

你实际上需要一个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 ;
Run Code Online (Sandbox Code Playgroud)

注意:确保没有任何具有相同名称和/或操作的预定义触发器.如果有一些,那么在创建新的之前删除它们.

  • ID不会为每个记录更新。它仅适用于第一条记录。 (2认同)

Abd*_*naf 3

我认为你做不到。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 ;
Run Code Online (Sandbox Code Playgroud)

它给出了类似的错误

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.
Run Code Online (Sandbox Code Playgroud)

你可以做的是使用事务:

示例:表结构如下

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)
Run Code Online (Sandbox Code Playgroud)

交易

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

检查数据

mysql> SELECT * FROM tbl_test;
+----+-------+----------+
| ID | title | priority |
+----+-------+----------+
|  1 | Dr    |        1 |
+----+-------+----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)