“INSERT IGNORE” vs “INSERT … ON DUPLICATE KEY UPDATE”

后端 未结 12 2502
孤街浪徒
孤街浪徒 2020-11-21 04:30

While executing an INSERT statement with many rows, I want to skip duplicate entries that would otherwise cause failure. After some research, my options appear

12条回答
  •  悲哀的现实
    2020-11-21 04:58

    In case you want to see what this all means, here is a blow-by-blow of everything:

    CREATE TABLE `users_partners` (
      `uid` int(11) NOT NULL DEFAULT '0',
      `pid` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`uid`,`pid`),
      KEY `partner_user` (`pid`,`uid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    

    Primary key is based on both columns of this quick reference table. A Primary key requires unique values.

    Let's begin:

    INSERT INTO users_partners (uid,pid) VALUES (1,1);
    ...1 row(s) affected
    
    INSERT INTO users_partners (uid,pid) VALUES (1,1);
    ...Error Code : 1062
    ...Duplicate entry '1-1' for key 'PRIMARY'
    
    INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1);
    ...0 row(s) affected
    
    INSERT INTO users_partners (uid,pid) VALUES (1,1) ON DUPLICATE KEY UPDATE uid=uid
    ...0 row(s) affected
    

    note, the above saved too much extra work by setting the column equal to itself, no update actually needed

    REPLACE INTO users_partners (uid,pid) VALUES (1,1)
    ...2 row(s) affected
    

    and now some multiple row tests:

    INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
    ...Error Code : 1062
    ...Duplicate entry '1-1' for key 'PRIMARY'
    
    INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
    ...3 row(s) affected
    

    no other messages were generated in console, and it now has those 4 values in the table data. I deleted everything except (1,1) so I could test from the same playing field

    INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4) ON DUPLICATE KEY UPDATE uid=uid
    ...3 row(s) affected
    
    REPLACE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
    ...5 row(s) affected
    

    So there you have it. Since this was all performed on a fresh table with nearly no data and not in production, the times for execution were microscopic and irrelevant. Anyone with real-world data would be more than welcome to contribute it.

提交回复
热议问题