MySQL触发器更新新行

时间:2011-07-07 16:00:04

标签: mysql sql triggers

我们正在两个系统之间进行迁移,并且需要为我们的一个数据库表保留2个字段,这些字段始终保持同步。这是表结构:

CREATE TABLE `example` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `object_id` int(11) NOT NULL DEFAULT '0',
  `value` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `object_id` (`object_id`)
);

每次其中一个系统插入新行时,我们需要将object_id设置为id。我们不能使用'before insert',因为id列是一个auto_increment列,因此在插入之前它的值为NULL,并且由于MySQL'插入'触发器后的限制'我无法执行以下操作:

CREATE TRIGGER insert_example 
  AFTER INSERT ON  example 
  FOR EACH ROW 
  SET NEW.object_id = NEW.id;

我无法更新任何一个系统的代码,因此我需要一种在数据库端完成此操作的方法。两个系统都将插入新行。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:5)

使用在插入之前触发的触发器应该完成工作

CREATE TRIGGER insert_example 
  BEFORE INSERT ON  example 
  FOR EACH ROW 
  SET NEW.object_id = NEW.id;

编辑:

正如OP指出的那样,NEW.id不能用于自动增量;一个可以使用以下触发器(使用风险自负):

CREATE TRIGGER insert_example 
      BEFORE INSERT ON  example 
      FOR EACH ROW 
      SET NEW.object_id = (
            SELECT AUTO_INCREMENT 
            FROM information_schema.TABLES 
            WHERE TABLE_SCHEMA = DATABASE() 
            AND TABLE_NAME = 'example'
      );

但我宁愿重新考虑这个有点奇怪的要求 - 为什么你需要在表格中两次获得pk值?

答案 1 :(得分:0)

答案 2 :(得分:-1)

我认为您的触发器永远不会创建,因为您无法在AFTER INSERT触发器中引用NEW.column_name。

尝试在BEFORE INSERT触发器中执行此操作(请不要这样修复,因为它不起作用):

CREATE TRIGGER `insert_example` BEFORE INSERT ON `t`
FOR EACH ROW 
SET NEW.`object_id` = NEW.`id`;

请根据您的架构更改表名和列名。

希望这有帮助。

相关问题