Ich habe eine INSERT
Aussage, die wie folgt aussieht:ON DUPLICATE KEY UPDATE funktioniert nicht, wenn es ein Update-Trigger ist
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)
Auf diese Weise, es zu tun einfach gut gearbeitet hat. Es funktioniert nicht, wenn ich die folgenden Trigger hinzugefügt:
CREATE TRIGGER officer_update BEFORE UPDATE ON `officer`
FOR EACH ROW SET NEW.updated_at = NOW(), NEW.created_at = OLD.created_at
Es ist nicht, dass der officer
Datensatz wird nicht eingesetzt zu werden. Es scheint nur, dass der Auslöser Hijacking LAST_INSERT_ID()
oder etwas ist. Ich sage dies, weil die nächste Abfrage, der ausgeführt wird, ist dies:
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')
Da ich Dutzende von erfolgreichen Importen mit exakt der gleichen Datei ausgeführt habe, habe ich meinen Code nicht geändert, und jetzt meine Importe nicht arbeiten Nachdem ich diesen Auslöser hinzugefügt habe, muss ich daraus schließen, dass der Auslöser der Schuldige ist. Ich hatte eine ähnliche Situation mit einem anderen Tisch und das Entfernen des Auslösers behebt das Problem.
Also meine Fragen sind:
- Kann jemand erklären, was, speziell ist, mein Offizier id verursacht auf 0 gesetzt werden?
- Was ist eine gute Lösung für dieses Problem?
Ich habe einen anderen Auslöser auf officer.created_at
(und viele andere created_at
s Tabellen) und ich würde es vorziehen, eine Art umständlich Lösung zu vermeiden, wo ich einen Trigger auf created_at
aber eine DEFAULT CURRENT_TIMESTAMP
auf updated_at
haben. Aus irgendeinem Grund lässt MySQL nur einen automatischen Zeitstempel pro Tabelle zu, so dass ich CURRENT_TIMESTAMP
für beide created_at
und updated_at
nicht tun kann.
Hier ist die SHOW CREATE TABLE
für 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
Könnten Sie bitte die Ergebnisse von 'SHOW CREATE TABLE officer' und die Abfrage, die falsch funktioniert? Ihr Titel sagt 'ON DUPLICATE KEY UPDATE', aber es gibt keine solche Frage in der Post. – Quassnoi
Woops. Guter Fang. Ich habe die Frage aktualisiert. –
Können Sie bitte Ihren Code einfügen, den Sie verwenden, um den Wert von 'LAST_INSERT_ID()' * zurückzuziehen? scheint auf meiner Maschine gut zu funktionieren MySql 5.1.53 –