MYSQL: INSERT ON DUPLICATE KEY (LAST_INSERT_ID)
Problém při vracení Idečka naposled upraveného záznamu z tabulky při použití v dotazu ON DUPLICATE KEY
Máme tabulku se strukturou například podobné této:
1 2 3 4 5 6 7 8 |
CREATE TABLE `table` ( `table_id` int(11) NOT NULL auto_increment, `string_value` varchar(255) NOT NULL, `string_count` int(11) default '1', `domain_id` int(1) NOT NULL, PRIMARY KEY (`string_value`,`domain_id`), UNIQUE KEY `table` (`table_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
Na tabulku chceme provést insert, ale v případě duplicitních klíčů (primární klíče jsou v tabulce nastaveny pro string_value a domain_id) chceme pouze zvýšit hodnotu ve sloupci string_count, prostě klasický dotaz, se kterým se často setkáváme.
V tomhle není žádný problém, provedeme jednoduchý dotaz:
1 2 3 4 |
INSERT INTO `table`(`string_value`, `string_count`, `domain_id`) VALUES('STRING', 1, 1) ON DUPLICATE KEY UPDATE string_count = string_count + 1; |
Problém nastane v případě, že chceme zjistit naposled vložené nebo upravené table_id, kedy hodnotu primárního klíče.
Při samotném insertu bychom použili funkci LAST_INSERT_ID(), která nám jeho vrátí hodnotu nejvyššího ID:
1 |
SELECT LAST_INSERT_ID(); |
Ovšem při použití ON DUPLICATE KEY toto možné není.
Při uložení nového záznamu nám LAST_INSERT_ID opravdu vrací hodnotu nového záznamu, ovšem u provedeného update vrátí hodnotu maximálhího ID + 1, na kterou je nastaveno.
Řešení je velice jednoduché:
1 2 3 4 5 |
INSERT INTO `table`(`string_value`, `string_count`, `domain_id`) VALUES('STRING', 1, 1) ON DUPLICATE KEY UPDATE <span style="color: red">table_id = LAST_INSERT_ID(table_id)</span>, string_count = string_count + 1; |
V tomto případě nám zavolání LAST_INSERT_ID() bude konečně vracet hodnotu naposled upraveného záznamu bez ohledu na to, zda jsme prováděli UPDATE nebo INSERT na tabulku.
Viz také http://php.vrana.cz/pridani-hodnoty-do-unikatniho-ciselniku.php
Diky 🙂