Tengo una declaración INSERT
que tiene este aspecto:EN DUPLICADO KEY UPDATE no funciona cuando hay un desencadenador 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)
Esta forma de hacer que ha estado trabajando muy bien. Que dejó de funcionar cuando he añadido el siguiente trigger:
CREATE TRIGGER officer_update BEFORE UPDATE ON `officer`
FOR EACH ROW SET NEW.updated_at = NOW(), NEW.created_at = OLD.created_at
No es que no está siendo insertado el registro officer
. Simplemente parece que el detonador es secuestro LAST_INSERT_ID()
o algo así. Digo esto porque la próxima consulta que se ejecuta es la siguiente:
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')
Dado que me he encontrado decenas de importaciones de éxito con el mismo archivo exacto, no he cambiado mi código, y ahora mis importaciones no están funcionando después de agregar este disparador, debo deducir que el desencadenante es el culpable. Tuve una situación similar con otra mesa y al eliminar el disparador se solucionó el problema.
Así que mis preguntas son:
- Puede alguien explicar por qué, específicamente, está causando mi identificación oficial para ponerse a 0?
- ¿Qué es una buena solución a este problema?
tengo otro gatillo en officer.created_at
(y un montón de otras mesas created_at
s) y yo preferiría evitar algún tipo de solución incómoda en la que tengo un disparador en created_at
sino un DEFAULT CURRENT_TIMESTAMP
en updated_at
. Por alguna razón, MySQL solo permite una marca de tiempo automática por tabla, por lo que no puedo hacer CURRENT_TIMESTAMP
para ambos created_at
y updated_at
.
Aquí es el SHOW CREATE TABLE
para 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
¿Podría publicar los resultados del comando 'SHOW CREATE TABLE' y la consulta que funciona incorrectamente? Su título dice 'ON DUPLICATE KEY UPDATE' pero no hay tal consulta en la publicación. – Quassnoi
Woops. Buena atrapada. He actualizado la pregunta. –
¿Puedes pegar el código que utilizas para * retireve * el valor de 'LAST_INSERT_ID()'? parece estar funcionando bien en mi máquina MySql 5.1.53 –