INSERT ... рдЖрдкрд╛рддрдХрд╛рд▓реАрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ DUPLICATE рдкреНрд░рдореБрдЦ рдЕрджреНрдпрддрди рд╡реНрдпрд╡рд╣рд╛рд░

рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ, рдореИрдВ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреА рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХрд╛ рднреА рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рд▓рдЧрднрдЧ рд╣рд░ 4 рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рд╣реБрдЖред рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдпрд╛ рдкреВрдЫрддрд╛рдЫ рдореЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХ рдПрдХрд▓ рддрд╛рд▓рд┐рдХрд╛ рдереА рдЬрд┐рд╕рдореЗрдВ, рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, INT AUTO_INCREMENT PRIMARY KEY рдФрд░ UNIQUE KEY рдореМрдЬреВрдж рдереАрдВред

рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ INSERT ... ON DUPLICATE KEY UPDATE (рдмрд╛рдж INSERT ODKU ), рдЬрд╣рд╛рдБ INSERT рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХреЙрд▓рдо UNIQUE KEY рд╕рд╛рде рдХреЙрд▓рдо рдХреЗ рдЕрдиреБрд░реВрдк рдереЗред рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐ рджрд┐рди рд▓рдЧрднрдЧ 24 рдШрдВрдЯреЗ рд▓рдЧрд╛рддрд╛рд░ 1500-2000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЧрдгрд┐рдд рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рдерд╛ред

рдЪрд░реНрдЪрд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЪрд┐рддреНрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВрдЧреЗ:

 CREATE TABLE update_test ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL, host_id TINYINT UNSIGNED NOT NULL, last_modified TIMESTAMP NULL DEFAULT NULL, PRIMARY KEY(id), UNIQUE KEY(username) ) ENGINE=InnoDB; 

рдЕрдм рдШрдЯрдирд╛рдУрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:

 (root@localhost) [test]> INSERT INTO update_test (username, host_id, last_modified) VALUES ('foo',3,NOW()); Query OK, 1 row affected (0.00 sec) (root@localhost) [test]> select * from update_test; +----+----------+---------+---------------------+ | id | username | host_id | last_modified | +----+----------+---------+---------------------+ | 1 | foo | 3 | 2012-10-05 22:36:30 | +----+----------+---------+---------------------+ 

рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдмрд╛рд╣рд░ рдХреБрдЫ рднреА рдирд╣реАрдВ, рд╣реИ рдирд╛? рд╣рдордиреЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдПрдХ рдЦрд╛рд▓реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рд╛ рдФрд░ рдпрджрд┐ рд╣рдо SHOW CREATE TABLE , рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ AUTO_INCREMENT рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдорд╛рди рдЕрднреА 2 ред рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ INSERT ODKU рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:

 (root@localhost) [test]> insert into update_test (username,host_id) values ('foo',1) on duplicate key update last_modified=NOW(); Query OK, 2 rows affected (0.00 sec) (root@localhost) [test]> select * from update_test; +----+----------+---------+---------------------+ | id | username | host_id | last_modified | +----+----------+---------+---------------------+ | 1 | foo | 3 | 2012-10-05 22:58:28 | +----+----------+---------+---------------------+ 1 row in set (0.00 sec) 

рдФрд░ рдЕрдм, рднрд▓реЗ рд╣реА рд╣рдордиреЗ рдирдИ рдкрдВрдХреНрддрд┐ рди AUTO_INCREMENT рд╣реЛ, рд╣рдорд╛рд░рд╛ AUTO_INCREMENT рдХрд╛рдЙрдВрдЯрд░ 3 рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред InnoDB рдЙрди рдмрд╛рдзрд╛рдУрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рдФрд░ PRIMARY KEY рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдЬрд╛рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, MySQL рд╣рдорд╛рд░реЗ INSERT рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛ AUTO_INCREMENT рдореВрд▓реНрдп рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ UNIQUE KEY рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд▓реНрд▓рдВрдШрди рдкрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП INSERT рдмрдЬрд╛рдп рдпрд╣ UPDATE рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо handler status рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдбрд╛рд▓рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдПрдХ рдЕрджреНрдпрддрди рдЕрдиреБрд░реЛрдз рд╕рдлрд▓ рд╣реБрдЖ (рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреНрдпреЛрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рдерд╛, 1 рдирд╣реАрдВ)ред

 (root@localhost) [test]> show status like 'handler%'; *** some rows omitted *** +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Handler_commit | 1 | | Handler_rollback | 0 | | Handler_update | 1 | | Handler_write | 1 | +----------------------------+-------+ 

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, "рддреЛ рдХреНрдпрд╛?" рдЖрдЗрдП рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред 1,500 INSERT ODKU рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб, рд▓рдЧрд╛рддрд╛рд░ 24 рдШрдВрдЯреЗред рдЙрдирдХреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ PRIMARY KEY рд╡рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдбреЗрдореЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ - INT UNSIGNED ред рд╣рдо рдЧрд┐рдирддреЗ рд╣реИрдВред INT UNSIGNED рдХрд╛ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп 4294967295 ред рд╣рдо рдЗрд╕реЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1500 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ 86400 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рджрд┐рди рдореЗрдВ рд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ 33.1 рджрд┐рди, рдпрд╛ 4 рд╕рдкреНрддрд╛рд╣ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд┐рд▓рддрд╛ рд╣реИред рд╕рдВрдпреЛрдЧ? рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред рддреЛ рдЬрдм рд╣рдо рдЕрд░реНрде рд╕реЗ рдкрд░реЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдХреБрдЫ рд╡реНрдпрд╡рд╣рд╛рд░ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЕрдкрдиреА рдбреЗрдореЛ рдЯреЗрдмрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕рдореЗрдВ AUTO_INCREMENT рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рдбрд╛рд▓реЗрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдбрд╛рд▓реЗрдВред

 (root@localhost) [test]> insert into update_test (id,username,host_id) values (4294967295, 'bar', 10); Query OK, 1 row affected (0.00 sec) (root@localhost) [test]> flush status; (root@localhost) [test]> insert into update_test (username,host_id) values ('baz', 10); ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY' (root@localhost) [test]> show status like 'handler%'; *** some rows omitted *** +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Handler_rollback | 1 | | Handler_write | 1 | +----------------------------+-------+ 

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдкрдВрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдЖрдпрд╛, рдХреНрдпреЛрдВрдХрд┐ AUTO_INCREMENT рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдерд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рд╡рд┐рдлрд▓ рд░рд╣рд╛ред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рд╣рдо INSERT ODKU рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:

 (root@localhost) [test]> select * from update_test; +------------+----------+---------+---------------------+ | id | username | host_id | last_modified | +------------+----------+---------+---------------------+ | 1 | foo | 3 | 2012-10-05 22:58:28 | | 4294967295 | bar | 10 | NULL | +------------+----------+---------+---------------------+ 2 rows in set (0.00 sec) (root@localhost) [test]> INSERT INTO update_test (username, host_id) VALUES ('foo', 7) ON DUPLICATE KEY UPDATE host_id=7, last_modified=NOW(); Query OK, 2 rows affected (0.00 sec) 

рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╣реИ рдирд╛? 2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЬреЛ username = "foo" рд╕реНрдерд┐рддрд┐ рд╕реЗ host_id , host_id рдФрд░ last_modified рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП, рдФрд░ рд╣рдо рдЖрдирдиреНрджрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ:

 (root@localhost) [test]> select * from update_test; +------------+----------+---------+---------------------+ | id | username | host_id | last_modified | +------------+----------+---------+---------------------+ | 1 | foo | 3 | 2012-10-05 22:58:28 | | 4294967295 | bar | 7 | 2012-10-05 23:24:49 | +------------+----------+---------+---------------------+ 2 rows in set (0.00 sec) 

рдУрд╣, рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреА id рд╣рдорд╛рд░реЗ AUTO_INCREMENT рдХреЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ username рдХреЙрд▓рдо рдкрд░ UNIQUE KEY рдХреА рдЕрдирджреЗрдЦреА рдХреА рдЧрдИ рдереАред

рдЕрдм рд╣рдо рдЙрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрд╕ рдкрдж рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред 1500 рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдЕрдиреБрд░реЛрдз, рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ - INT рд╕реЗ BIGINT рддрдХ AUTO_INCREMENT рдХреЙрд▓рдо рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓реЗрдВред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ ред рдореИрдиреБрдЕрд▓ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдЕрджреНрд╡рд┐рддреАрдп рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдмрд▓ рдкрд░ рд╣рдорд╛рд░рд╛ INSERT ODKU UPDATE update_test SET host_id = 7, last_modified = NOW() WHERE id = 4294967295 OR username = "foo" LIMIT 1 рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рдХ PRIMARY рдмрдЬрд╛рдп PRIMARY рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ред UNIQUE ред

рд╣рдордиреЗ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╕реАрдЦрд╛ рд╣реИ?


Source: https://habr.com/ru/post/In156489/


All Articles