www.www.zaachi.com »  Blog/Databáze  »  MYSQL: INSERT ON DUPLICATE KEY (LAST_INSERT_ID)

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

 

Reklama

Pokud mě chcete podpořit a jste milovník jedné stopy, navštivte můj projekt: MotoArena.cz

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.

 

 


linkuj topclanky
Komentáře (2)

Autor: Zaachi
Publikováno: 20.9.2009 00:13:37


Mohlo by vás zajímat:
PHP MySQL: Vyhledávání
MySQL: návrh databáze
PHP&MySQL: prohození sloupců v tabulce
Debian & Mysql: reset hesla
TOPLIST.cz
rss coments img img img