MySQL Trigger для обновления новой строки - PullRequest
2 голосов
/ 07 июля 2011

Мы находимся в процессе миграции между двумя системами, и нам необходимо иметь 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.Мы не можем использовать «перед вставкой», поскольку столбец id является столбцом auto_increment, поэтому его значение равно NULL до вставки, и из-за ограничений MySQL «после вставки» в триггерах я не могу сделать следующее:

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

Я не могу обновить код ни для одной из систем, поэтому мне нужен способ сделать это на стороне базы данных.Обе системы будут вставлять новые строки.Как мне это сделать?

Ответы [ 3 ]

5 голосов
/ 07 июля 2011

Использование триггера, который срабатывает до того, как вставка должна выполнить работу

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

EDIT:

Как указывалось в 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 в таблице?

0 голосов
/ 07 июля 2011

Я думаю, ваш триггер никогда не будет создан, потому что вы не можете ссылаться на NEW.column_name в триггере AFTER INSERT.

Попробуйте сделать это в триггере ПЕРЕД ВСТАВКОЙ (ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ ЭТО ИСПРАВЛЕНИЕ, КАК ЭТО НЕ БУДЕТ РАБОТАТЬ):

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

Пожалуйста, измените имена таблиц и столбцов в соответствии с вашей схемой.

Надеюсь, это поможет.

0 голосов
/ 07 июля 2011

Есть ли причина, по которой вы не можете использовать BEFORE INSERT триггер?

Я всегда видел AFTER INSERT триггеры как метод манипулирования другими таблицами, а не таблицей, для которой был выполнен триггер.

Правило большого пальца, управляйте таблицей, на которой работает триггер = BEFORE INSERT, управляйте другими таблицами AFTER INSERT:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...