gpt4 book ai didi

MYSQL触发器在两个表中保留相同的数据

转载 作者:行者123 更新时间:2023-11-29 21:59:51 25 4
gpt4 key购买 nike

出于多种原因,我需要在两个表中拥有相同的数据。我正在启动新系统,并且在短时间内我需要让两个系统都运行,问题是旧系统没有很好的 MySQL 结构,因此无法保持原样。我不想更改旧的或新的系统配置。我认为他最好的解决方案是在新旧表上放置一些触发器,如下所示:

DROP TRIGGER IF EXISTS table1_table2;
DELIMITER $$
CREATE TRIGGER `table1_table2` AFTER INSERT ON `table1`
FOR EACH ROW
BEGIN
IF(@disable_triggers != 1) THEN
SET @disable_triggers = 1;
INSERT INTO table2 (value1,value2)
VALUES( NEW.value1, NEW.value2 );
END IF;
SET @disable_triggers = 0;
END$$
DELIMITER ;

DROP TRIGGER IF EXISTS table2_table1;
DELIMITER $$
CREATE TRIGGER `table2_table1` AFTER INSERT ON `table2`
FOR EACH ROW
BEGIN
IF(@disable_triggers != 1) THEN
SET @disable_triggers = 1;
INSERT INTO table1 (value1,value2)
VALUES( NEW.value1, NEW.value2 );
END IF;
SET @disable_triggers = 0;
END$$
DELIMITER ;

首先尝试创建没有 IF 条件的触发器,但失败了,因为 table1 被锁定,因此第二个触发器无法写入它。我决定添加 @disable_triggers 全局变量以防止循环运行触发器,但插入后没有任何反应,有什么建议吗?

最佳答案

感谢 e4c5。最好的解决方案是创建 VIEW:

CREATE TABLE IF NOT EXISTS `table2` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`t2col1` int(11) DEFAULT 0,
`t2col2` int(11) DEFAULT 0,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

INSERT INTO `table2` (`t2col1`, `t2col2`)
SELECT `t1col1`, `t1col2` FROM `table1`;

DROP TABLE IF EXISTS `table1`;
CREATE OR REPLACE VIEW `table1` AS
SELECT `t2col1` AS `t1col1`, `t2col2` AS `t1col2`
FROM `table2`;

两个查询有相同的结果

SELECT * FROM `table1`;

SELECT * FROM `table2`;

与INSERT相同

关于MYSQL触发器在两个表中保留相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32756954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com