【问题标题】:FEDERATED using trigger in mysql在 mysql 中使用触发器 FEDERATED
【发布时间】:2017-02-14 15:55:11
【问题描述】:

在这里,我在不同的服务器上有两个 mysql 服务器,我不想使用 FEDERATED 将一个表数据复制到另一个。

但是使用下面的触发代码它不起作用,甚至没有错误。

在下面查找原始和联合表结构。

vxp_config的原始表结构

CREATE TABLE IF NOT EXISTS `vxp_config` (
  `cfg_id` int(11) NOT NULL AUTO_INCREMENT,
  `cfg_key` varchar(50) NOT NULL,
  `cfg_value` varchar(500) NOT NULL,
  `cfg_field_type` enum('TEXT','TEXTAREA','FILE','CHECKBOX') NOT NULL DEFAULT 'TEXT',
  PRIMARY KEY (`cfg_id`),
  UNIQUE KEY `cfg_key` (`cfg_key`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

vxp_config的联合表结构

CREATE TABLE IF NOT EXISTS `vxp_config` (
  `cfg_id` int(11) NOT NULL AUTO_INCREMENT,
  `cfg_key` varchar(50) NOT NULL,
  `cfg_value` varchar(500) NOT NULL,
  `cfg_field_type` enum('TEXT','TEXTAREA','FILE','CHECKBOX') NOT NULL DEFAULT 'TEXT',
  PRIMARY KEY (`cfg_id`),
  UNIQUE KEY `cfg_key` (`cfg_key`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 CONNECTION='mysql://root:password@host:3306/replicate/vxp_config';

触发器vxp_config

DROP TRIGGER IF EXISTS `config_bd`;
DELIMITER //
CREATE TRIGGER `config_bd` BEFORE DELETE ON `vxp_config`
 FOR EACH ROW BEGIN
   DELETE FROM vxp_config
   WHERE cfg_id= OLD.cfg_id;
END
//
DELIMITER ;
DROP TRIGGER IF EXISTS `config_bi`;
DELIMITER //
CREATE TRIGGER `config_bi` BEFORE INSERT ON `vxp_config`
 FOR EACH ROW BEGIN
  INSERT INTO vxp_config (cfg_id,cfg_key, cfg_value,cfg_field_type) VALUES (NEW.cfg_id,NEW.cfg_key, NEW.cfg_value,NEW.cfg_field_type);
END
//
DELIMITER ;
DROP TRIGGER IF EXISTS `config_bu`;
DELIMITER //
CREATE TRIGGER `config_bu` BEFORE UPDATE ON `vxp_config`
 FOR EACH ROW BEGIN
  UPDATE vxp_config 
     SET cfg_id= NEW.cfg_id,
         cfg_key= NEW.cfg_key,
         cfg_value = NEW.cfg_value,
         cfg_field_type = NEW.cfg_field_type
   WHERE cfg_id = OLD.cfg_id;
END
//
DELIMITER ;

【问题讨论】:

    标签: mysql database triggers federation


    【解决方案1】:

    我认为这不是使用 FEDERATED 表的方式。

    这是一个错误还是您实际上正在使用:

    ENGINE=InnoDB DEFAULT [...] CONNECTION
    

    此外,联邦不使用索引,触发器也不起作用。

    我认为最好使用从服务器 1 到服务器 2 的正确复制并在服务器 2 上创建所有触发器,可能在另一个表上镜像从服务器 1 复制的表

    【讨论】:

    • 你能建议我根据条件从服务器一复制到服务器二的数据吗?
    • 不,正如我之前所说,我会从 master 复制数据并制作一个“工作”表,其中包含您可能需要的所有触发器直接在 slave 上
    【解决方案2】:

    当你想定义联合表时,设置 引擎=联邦

    这样,您就不需要触发器,因为 FEDERATED 表只是表示(或链接到)原始表。您对联合表执行的所有查询都在原始服务器(表)上执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2015-03-01
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多