有没有一种方法可以使用MySQL触发器复制表中的记录,但在插入之前修改数据?

有没有一种方法可以使用MySQL触发器复制表中的记录,但在插入之前修改数据?,mysql,stored-procedures,triggers,sql-update,Mysql,Stored Procedures,Triggers,Sql Update,我正在对数据库中的几个表应用一系列触发器-这些触发器将用于在某些相关数据更新时创建软删除/阴影记录 一个例子,考虑这个表: CREATE TABLE `cms_content` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(40) NOT NULL, `tag` varchar(20) NOT NULL, `data` text NOT NULL, `is_active` tinyint(1)

我正在对数据库中的几个表应用一系列触发器-这些触发器将用于在某些相关数据更新时创建软删除/阴影记录

一个例子,考虑这个表:

CREATE TABLE `cms_content` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(40) NOT NULL,
  `tag` varchar(20) NOT NULL,
  `data` text NOT NULL,
  `is_active` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `created_by` int(10) unsigned DEFAULT NULL,
  `updated_by` int(10) unsigned DEFAULT NULL,
  `created` datetime DEFAULT CURRENT_TIMESTAMP,
  `modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='                   ';
使用此查询

UPDATE cms_content SET `tag` = 'user-cities-field' WHERE id = 3;
执行此查询时,我希望基本上执行以下操作:

  • 将传入记录的INSERT
    id
    设置为NULL,以便
    AUTO_INCREMENT
    将相应地设置下一个值
  • 插入已更新记录的副本,唯一的修改是
    处于活动状态
    标志需要设置为
    1
  • 我知道您不能在这里更新表,因为MySQL将阻止它以防止递归
  • 如果有办法,您能否在更新之前选择要更新的记录,然后插入修改后的记录
使用存储函数来处理这个问题会更有用吗

我需要做的是选择旧记录更新前,然后在插入前更改该记录上的处于活动状态标志的值。下面是我一直使用的代码

触发器

CREATE DEFINER=`root`@`localhost` TRIGGER `cms_content_AFTER_UPDATE` BEFORE UPDATE ON `cms_content` FOR EACH ROW BEGIN
    IF (NEW.is_active = 1) THEN

        SET NEW.id = NULL;

        INSERT INTO `tester`.`cms_content` (SELECT *, 0 as is_active  from `cms_content` WHERE `id` = OLD.`id`);
        #UPDATE      `tester`.`cms_content` SET is_active = 0 WHERE `id` = OLD.`id`;

    END IF;
END

您认为“MySQL将阻止它以防止递归”是正确的,并且使用触发器无法绕过这一点。为什么不创建一个cms_内容_历史记录表,它可以通过cms_内容上的触发器进行维护。我不认为联接/联合的开销会很繁重。@P.Salmon我需要能够在当前表中创建影子记录/软删除记录。这是可能的吗?你说的“MySQL将阻止它以防止递归”是正确的,使用触发器是没有办法的。为什么不创建一个cms_内容_历史记录表,它可以通过cms_内容上的触发器进行维护。我不认为联接/联合的开销会很繁重。@P.Salmon我需要能够在当前表中创建影子记录/软删除记录。可能吗?