【问题标题】:Create a mysql trigger to insert data when a column updated创建一个mysql触发器以在列更新时插入数据
【发布时间】:2017-01-20 13:57:59
【问题描述】:
CREATE TRIGGER `update_2` 
AFTER UPDATE ON `itm_master`
FOR EACH ROW 
BEGIN
    IF NEW.transfer_status='YES' THEN
        INSERT into activity_tbl (`evnt_date`,`con_type`,`username`,`item_serial`,`item_model`,`item_type`,`to_status`)
        VALUES (now(),'Update',NEW.user,NEW.item_serial,NEW.master_item_model,NEW.master_item_type,NEW.item_status);
    END IF;
END

每当 item_master 表中的 transfer_status 字段更新时,我想创建一个触发器以将数据插入到 activity_tbl 中。我使用此查询,但收到 Mysql 错误

CREATE TRIGGER `update_2` 
AFTER UPDATE ON `itm_master`
FOR EACH ROW 
BEGIN
    IF NEW.transfer_status='YES' THEN
        INSERT into activity_tbl (`evnt_date`,`con_type`,`username`,`item_serial`,`item_model`,`item_type`,`to_status`)
        VALUES (now(),'Update',NEW.user,NEW.item_serial,NEW.master_item_model,NEW.master_item_type,NEW.item_status);

MySQL 说:文档

1064 - Erreur de syntaxe près de '' à la ligne 7

【问题讨论】:

  • 就我个人而言,我尽量避免使用触发器,当您查看代码时,添加这些数据似乎很神奇。在插入其他数据时插入数据更具可读性。除此之外,我无法阅读该错误消息...
  • 我同意那个
  • 你的代码是第一个还是第二个?我可以看到第二个会出现语法错误,因为它不完整(没有 END IF,BEGIN 没有 END)。错误是用英语说的吗?

标签: php mysql triggers


【解决方案1】:

我得到了这个工作。我目前没有创意评论。

架构:

create table itm_master
(   id int auto_increment primary key,
    transfer_status VARCHAR(100) NOT NULL,
    user VARCHAR(100) NOT NULL,
    item_serial VARCHAR(100) NOT NULL,
    master_item_model VARCHAR(100) NOT NULL,
    master_item_type VARCHAR(100) NOT NULL,
    item_status VARCHAR(100) NOT NULL
);
create table activity_tbl
(   id int auto_increment primary key,
    `evnt_date` DATETIME NOT NULL,
    `con_type` VARCHAR(100) NOT NULL,
    `username` VARCHAR(100) NOT NULL,
    `item_serial` VARCHAR(100) NOT NULL,
    `item_model` VARCHAR(100) NOT NULL,
    `item_type` VARCHAR(100) NOT NULL,
    `to_status` VARCHAR(100) NOT NULL
);

触发:

DROP TRIGGER IF EXISTS update_2;
DELIMITER $$
CREATE TRIGGER `update_2` 
AFTER UPDATE ON `itm_master`
FOR EACH ROW 
BEGIN
    IF NEW.transfer_status='YES' THEN
        INSERT into activity_tbl (`evnt_date`,`con_type`,`username`,`item_serial`,`item_model`,`item_type`,`to_status`)
        VALUES (now(),'Update',NEW.user,NEW.item_serial,NEW.master_item_model,NEW.master_item_type,NEW.item_status);
    END IF;
END;$$
DELIMITER ;

测试:

INSERT itm_master(transfer_status, user, item_serial, master_item_model, master_item_type, item_status) values
('a','b','c','d','e','f');

UPDATE itm_master SET transfer_status='blah' WHERE id=1;
select * from activity_tbl;
-- no rows

UPDATE itm_master SET transfer_status='YES' WHERE id=1;
select * from activity_tbl;
+----+---------------------+----------+----------+-------------+------------+-----------+-----------+
| id | evnt_date           | con_type | username | item_serial | item_model | item_type | to_status |
+----+---------------------+----------+----------+-------------+------------+-----------+-----------+
|  1 | 2016-09-13 00:14:26 | Update   | b        | c           | d          | e         | f         |
+----+---------------------+----------+----------+-------------+------------+-----------+-----------+

PHPMyAdmin 不需要 DELIMITER 包装器。

【讨论】:

  • 我使用了一次触发器在级联上删除,因为我有全文索引和 Mysql 5.4...
  • 谢谢!!!有效。虽然我找到了错误的原因......我的mysql版本不支持具有相同功能的多个触发器。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2020-08-23
  • 2012-04-13
  • 2021-04-13
  • 2020-01-28
相关资源
最近更新 更多