ON DUPLICATE KEY UPDATE не работает, когда есть триггер UPDATE

У меня есть инструкция INSERT , которая выглядит следующим образом:

INSERT INTO officer (officer_number,
                     name,
                     bank_id)    
VALUES ('',
        '',
        8)

ON DUPLICATE KEY UPDATE officer_number = '',
                        name = '',
                        bank_id = 8,
                        id = LAST_INSERT_ID(id)

Это способ сделать это работает нормально. Он перестал работать, когда я добавил следующий триггер:

CREATE TRIGGER officer_update BEFORE UPDATE ON `officer`
FOR EACH ROW SET NEW.updated_at = NOW(), NEW.created_at = OLD.created_at

Дело не в том, что запись офицера не вставляется. Просто кажется, что триггер захватывает LAST_INSERT_ID () или что-то в этом роде. Я говорю это, потому что следующий выполняемый запрос выглядит так:

INSERT INTO account (import_id,
                     branch_id,
                     account_number,
                     officer_id,
                     customer_id,
                     open_date,
                     maturity_date,
                     interest_rate,
                     balance,
                     opening_balance)
VALUES ('123',
        '4567',
        '789',
        '0', # This is the officer id which is of course invalid
        '321',
        '1992-04-22',
        '2012-05-22',
        '0.0123',
        '0',
        '10000')

Поскольку я выполнил десятки успешных операций импорта с одним и тем же файлом, я не изменил свой код, и теперь мои операции импорта не работают после того, как я добавил это триггер, я должен сделать вывод, что триггер является виновником. У меня была аналогичная ситуация с другой таблицей, и удаление триггера решило проблему.

Итак, мои вопросы:

  1. Может кто-нибудь объяснить, что, Просто кажется, что триггер захватывает LAST_INSERT_ID () или что-то в этом роде. Я говорю это, потому что следующий выполняемый запрос выглядит так:

    INSERT INTO account (import_id,
                         branch_id,
                         account_number,
                         officer_id,
                         customer_id,
                         open_date,
                         maturity_date,
                         interest_rate,
                         balance,
                         opening_balance)
    VALUES ('123',
            '4567',
            '789',
            '0', # This is the officer id which is of course invalid
            '321',
            '1992-04-22',
            '2012-05-22',
            '0.0123',
            '0',
            '10000')
    

    Поскольку я выполнил десятки успешных операций импорта с одним и тем же файлом, я не изменил свой код, и теперь мои операции импорта не работают после того, как я добавил это триггер, я должен сделать вывод, что триггер является виновником. У меня была аналогичная ситуация с другой таблицей, и удаление триггера решило проблему.

    Итак, мои вопросы:

    1. Может кто-нибудь объяснить, что, Просто кажется, что триггер захватывает LAST_INSERT_ID () или что-то в этом роде. Я говорю это, потому что следующий выполняемый запрос выглядит так:

      INSERT INTO account (import_id,
                           branch_id,
                           account_number,
                           officer_id,
                           customer_id,
                           open_date,
                           maturity_date,
                           interest_rate,
                           balance,
                           opening_balance)
      VALUES ('123',
              '4567',
              '789',
              '0', # This is the officer id which is of course invalid
              '321',
              '1992-04-22',
              '2012-05-22',
              '0.0123',
              '0',
              '10000')
      

      Поскольку я выполнил десятки успешных операций импорта с одним и тем же файлом, я не изменил свой код, и теперь мои операции импорта не работают после того, как я добавил это триггер, я должен сделать вывод, что триггер является виновником. У меня была аналогичная ситуация с другой таблицей, и удаление триггера решило проблему.

      Итак, мои вопросы:

      1. Может кто-нибудь объяснить, что, в частности, заставляет моего офицера id установить в 0?
      2. Что хорошего решение этой проблемы?

      У меня есть еще один триггер на Offic.created_at (и во многих других таблицах created_at s), и я бы предпочел избежать какого-то неудобного решения где у меня есть триггер на created_at , но DEFAULT CURRENT_TIMESTAMP на updated_at . По какой-то причине MySQL допускает только одну автоматическую метку времени для каждой таблицы, поэтому я не могу сделать CURRENT_TIMESTAMP для обоих created_at и updated_at .

      Вот это SHOW CREATE TABLE для офицера :

      CREATE TABLE `officer` (
        `id` bigint(20) NOT NULL AUTO_INCREMENT,
        `officer_number` varchar(255) NOT NULL,
        `name` varchar(255) NOT NULL,
        `bank_id` bigint(20) NOT NULL,
        `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        PRIMARY KEY (`id`),
        UNIQUE KEY `officer_number` (`officer_number`,`name`),
        UNIQUE KEY `officer_number_2` (`officer_number`,`bank_id`),
        KEY `bank_id` (`bank_id`),
        CONSTRAINT `officer_ibfk_1` FOREIGN KEY (`bank_id`) REFERENCES `bank` (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=102735 DEFAULT CHARSET=latin1
      
6
задан Jason Swett 9 November 2010 в 13:45
поделиться