insert into on duplicate key update

問題

有一個表,建表語句以下:html

CREATE TABLE `tbl_host` (
  `id` bigint(64) NOT NULL AUTO_INCREMENT,
  `ip` varchar(255) NOT NULL DEFAULT '',
  `host_name` varchar(2555) NOT NULL DEFAULT '',
`timestamp` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_ip` (`ip`)
) ENGINE=InnoDB AUTO_INCREMENT=84689426 DEFAULT CHARSET=utf8;

其中,mysql

  • id爲主鍵,自增字段
  • ip字段爲惟一鍵

插入和更新表時使用sql語句:sql

insert into tbl_host(ip, host_name, timestamp) values ('%s', '%s', '%d') on duplicate key update host_name='%s', timestamp='%d'

當頻繁update表記錄時,經過spa

mysql> show create table tbl_host

發現AUTO_INCREMENT在不斷增長。開始疑惑所使用的sql語句是否是有問題。.net

mysql官網給出說明:code

With an auto-increment column, an INSERT statement increases the auto-increment value but UPDATE does not.htm

具體到INSERT ON DUPLICATE KEY UPDATE,即便最終執行了 update,自增ID也是會增加的。blog

若是id持續增加,會不會越界呢?對於int64數據類型,每分鐘10w條記錄更新,1億年都消耗不完。因此,對於越界問題,能夠放心使用。ip

建議

當遇到對錶的操做是insert少, 須要大量update的狀況,不建議使用insert into on duplicate key update。那如何處理狀況呢?rem

  • 能夠首先select,若是查到則update,不然insert。
  • 或者能夠首先update,若是不存在,再insert。因爲insert插入操做量少,大部分都是update,所以效率相對於前一種更好。具體代碼可參考Go sql insert update使用舉例

參考

mysql官網 https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

statckoverflow https://stackoverflow.com/questions/23516958/on-duplicate-key-auto-increment-issue-mysql

mysql的AUTO_INCREMENT若是達到最大值會怎樣呢? https://blog.csdn.net/stpeace/article/details/78066262

相關文章
相關標籤/搜索