使用mysql中的触发器进行FEDERATED

时间:2015-06-12 10:03:08

标签: mysql database triggers federation

在这里,我在不同的服务器上有两个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 ;

2 个答案:

答案 0 :(得分:0)

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

这是一个错误,或者你实际上在使用:

ENGINE=InnoDB DEFAULT [...] CONNECTION

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

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

答案 1 :(得分:-1)

如果要定义联合表,请设置  ENGINE = FEDERATED

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