Situatie: ik heb een tabel `stock_actual` waarin ik de actuele voorraad bijhoud. Daarop zit de volgende trigger:
De tabel `stock_log` houdt simpelweg bij wat er allemaal in de voorraad gebeurt en is als volgt opgebouwd:
Nu krijg ik sinds een server migratie (waarbij we o.a. van MySQL 5.1 naar MySQL 5.5 gegaan zijn) de volgende warning bij een aanpassing in `stock_actual`:
Ik vraag me nu af hoe ik dit het beste kan oplossen. Natuurlijk kan ik die AUTO_INCREMENT eraf halen en zelf de autonumber bepalen a.h.v. de huidige hoogste autonumber +1, maar dat lijkt me niet erg handig (en net zo goed foutgevoelig, al wordt het dan niet gelogd). Ik lees suggesties over het gebruik van UUID(), maar dat vind ik nogal overkill voor zoiets.
Bruikbare tips zijn welkom.
SQL:
1
2
3
4
5
6
7
8
9
| CREATE DEFINER=`factor`@`localhost` TRIGGER `voorjou`.`au_stock_actual` AFTER UPDATE ON `voorjou`.`stock_actual` FOR EACH ROW BEGIN INSERT INTO stock_log (article_id, mutation, stock_reservation_type_id) VALUES (NEW.article_id, (NEW.quantity - OLD.quantity), NEW.stock_reservation_type_id); END$$ |
De tabel `stock_log` houdt simpelweg bij wat er allemaal in de voorraad gebeurt en is als volgt opgebouwd:
SQL:
1
2
3
4
5
6
7
8
9
10
| delimiter $$ CREATE TABLE `stock_log` ( `autonumber` int(10) unsigned NOT NULL AUTO_INCREMENT, `article_id` int(11) DEFAULT NULL, `stock_reservation_type_id` tinyint(3) unsigned DEFAULT NULL, `mutation` int(11) DEFAULT NULL, `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`autonumber`) ) ENGINE=MyISAM AUTO_INCREMENT=1299745 DEFAULT CHARSET=latin1$$ |
Nu krijg ik sinds een server migratie (waarbij we o.a. van MySQL 5.1 naar MySQL 5.5 gegaan zijn) de volgende warning bij een aanpassing in `stock_actual`:
Wat ik na wat googelen hiervan begrijp is dat deze waarschuwing komt omdat je er niet gegarandeerd op kunt vertrouwen dat de AUTO_INCREMENT waarde die hieruit volgt klopt.1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly.
Ik vraag me nu af hoe ik dit het beste kan oplossen. Natuurlijk kan ik die AUTO_INCREMENT eraf halen en zelf de autonumber bepalen a.h.v. de huidige hoogste autonumber +1, maar dat lijkt me niet erg handig (en net zo goed foutgevoelig, al wordt het dan niet gelogd). Ik lees suggesties over het gebruik van UUID(), maar dat vind ik nogal overkill voor zoiets.
Bruikbare tips zijn welkom.
Tjolk is lekker. overal en altijd.