У меня есть INSERT
заявление, которое выглядит следующим образом:дублированием KEY UPDATE не работает, когда есть UPDATE триггер
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
Это не то, что officer
запись не получает вставленный. Кажется, что триггер - это угон 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')
Так как я работать десятки успешного импорта с точно таким же файлом, я не изменил код, и теперь мой импорт не работает после того, как я добавил этот триггер, я должен вывести, что триггер является виновником. У меня была аналогичная ситуация с другой таблицей, и удаление триггера устранило проблему.
Так что мои вопросы:
- Может кто-нибудь объяснить, что, конкретно, вызывает мой офицер идентификатор, чтобы установить на 0?
- Что хорошего Решение этой проблемы?
У меня есть еще один триггер на officer.created_at
(и много других таблицы created_at
с), и я бы предпочел, чтобы избежать какого-то неудобного решения, где у меня есть триггер created_at
но и DEFAULT CURRENT_TIMESTAMP
на updated_at
. По какой-то причине MySQL разрешает только одну автоматическую отметку времени для таблицы, поэтому я не могу сделать CURRENT_TIMESTAMP
как для created_at
, так и для updated_at
.
Вот SHOW CREATE TABLE
для officer
:
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
Не могли бы вы опубликовать результаты 'SHOW CREATE TABLE officer' и запрос, который работает некорректно? Ваше название говорит 'ON DUPLICATE KEY UPDATE', но такого сообщения в сообщении нет. – Quassnoi
Woops. Хороший улов. Я обновил вопрос. –
Можете ли вы вставить свой код, который вы используете, в * retireve * значение 'LAST_INSERT_ID()'? похоже, отлично работает на моей машине. MySql 5.1.53 –