【问题标题】:MYSQL triggers to keep same data in two tablesMYSQL 触发器将相同的数据保存在两个表中
【发布时间】:2016-02-18 00:52:06
【问题描述】:

出于多种原因,我需要在两个表中拥有相同的数据。我正在启动新系统,并且在短时间内我需要同时运行两个系统,问题是旧系统没有那么好的 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 全局变量以防止循环运行触发器,但是插入后什么也没发生,有什么建议吗?

【问题讨论】:

  • 为什么需要两张表?删除一个并用视图替换它
  • 谢谢,希望一切顺利

标签: mysql triggers


【解决方案1】:

感谢 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 也一样

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2015-02-17
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多