www.www.zaachi.com » Blog/Databáze » 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:
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:
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:
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é:
INSERT INTO `table`(`string_value`, `string_count`, `domain_id`)
VALUES('STRING', 1, 1)
ON DUPLICATE KEY
UPDATE table_id = LAST_INSERT_ID(table_id),
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.

Autor: Zaachi
Publikováno: 20.9.2009 00:13:37
PHP MySQL: Vyhledávání
MySQL: návrh databáze
PHP&MySQL: prohození sloupců v tabulce
Debian & Mysql: reset hesla