有没有一种方法可以使用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
设置为NULL,以便id
将相应地设置下一个值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我需要能够在当前表中创建影子记录/软删除记录。可能吗?