日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL主键唯一键重复插入解决方法

發布時間:2025/1/21 数据库 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL主键唯一键重复插入解决方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們插入數據的時候,有可能碰到重復數據插入的問題,但是這些數據又是不被允許有重復值:

  • CREATE TABLE stuInfo?(
  • id INT NOT NULL COMMENT?'序號',
  • name VARCHAR(20)?NOT NULL DEFAULT?''?COMMENT?'姓名',
  • age INT NOT NULL DEFAULT?0?COMMENT?'年齡',
  • PRIMARY KEY?(id),
  • UNIQUE KEY uniq_name(name)
  • )?ENGINE=InnoDB?DEFAULT CHARSET=utf8 COMMENT='學生表';
  • ?

  • mysql>?INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25),(2,'aa',24);
  • ERROR?1062?(23000):?Duplicate?entry?'1'?for?key?'PRIMARY'
  • 解決方案:

    1. IGNORE

    使用ignore當插入的值遇到主鍵(PRIMARY KEY)或者唯一鍵(UNIQUE KEY)重復時自動忽略重復的記錄行,不影響后面的記錄行的插入。

  • INSERT IGNORE INTO stuInfo?(name,birthday,is_deleted)?VALUES?('yoona','1990-01-05',0),('aa','1990-01-16',0),('bb','1990-01-17',0);
  • 運行結果:

  • mysql>?INSERT IGNORE INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25),(2,'aa',24);
  • Query?OK,?2?rows affected?(0.02?sec)
  • Records:?3?Duplicates:?1?Warnings:?0
  • mysql>?select?*?from?stuInfo;
  • +----+-------+-----+
  • |?id?|?name?|?age?|
  • +----+-------+-----+
  • |?1?|?yoona?|?20?|
  • |?2?|?aa?|?24?|
  • +----+-------+-----+
  • 2?rows?in?set?(0.00?sec)
  • 我們可以從運行結果中看出,只有兩行受到影響,意思即(1,'yoona',20)數據插入,(1,'xiaosi',25)重復數據自動被忽略,(2,'aa',24)不重復數據繼續插入,不會受到重復數據的影響;

    2.?REPLACE

    使用replace當插入的記錄遇到主鍵或者唯一鍵重復時先刪除表中重復的記錄行再插入。

  • mysql>?REPLACE INTO stuInfo?(name,birthday,is_deleted)?VALUES?('yoona','1990-01-15',0),('yoona','1990-02-16',0),('aa','1990-01-13',0);
  • Query?OK,?4?rows affected?(0.02?sec)
  • Records:?3??Duplicates:?1??Warnings:?0
  • 運行結果:

  • mysql>?select?*?from?stuInfo;?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??+----+-------+------------+------------+
  • |?id?|?name ?|?birthday ??|?is_deleted?|
  • +----+-------+------------+------------+
  • |?21?|?yoona?|?1990-02-16?|?? ? ? ? ?0?|
  • |?22?|?aa ? ?|?1990-01-13?|?? ? ? ? ?0?|
  • +----+-------+------------+------------+
  • 2?rows?in?set?(0.00?sec)
  • 從輸出的信息可以看到是4行受影響,說明它是先插入了('yoona','1990-01-15',0)然后又刪除了('yoona','1990-01-15',0)。

    3.?ON DUPLICATE KEY UPDATE

    當插入的記錄遇到主鍵或者唯一鍵重復時,會執行后面定義的UPDATE操作。相當于先執行Insert 操作,再根據主鍵或者唯一鍵執行update操作

  • DROP TABLE ?IF EXISTS stuInfo;
  • CREATE TABLE stuInfo?(
  • ?id INT NOT NULL COMMENT?'序號',
  • ?name VARCHAR(20)?NOT NULL DEFAULT?''?COMMENT?'姓名',
  • ?age INT NOT NULL DEFAULT?0?COMMENT?'年齡',
  • ?PRIMARY KEY?(id),
  • ?UNIQUE KEY uniq_name(name)
  • )?ENGINE=InnoDB?DEFAULT CHARSET=utf8 COMMENT='學生表';
  • ?

    ON DUPLICATE KEY UPDATEVALUES解釋:

    VAULES(age)指的是待插入的記錄的值

    age指得是表的自身值,已插入值。

    1)第一種情形:

  • #VALUES(age) 待插入值 25
  • INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?VALUES(age)?+?1;
  • 相當于:

  • INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20);
  • UPDATE stuInfo
  • SET age?=?VALUES(age)?+?1
  • WHERE id?=?1;
  • 運行結果:

  • mysql>?INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?VALUES(age)?+?1;
  • Query?OK,?3?rows affected?(0.01?sec)
  • Records:?2?Duplicates:?1?Warnings:?0
  • mysql>?select?*?from?stuInfo;
  • +----+-------+-----+
  • |?id?|?name?|?age?|
  • +----+-------+-----+
  • |?1?|?yoona?|?26?|
  • +----+-------+-----+
  • 1?row?in?set?(0.00?sec)
  • ?

    2)第二種情形:

  • #age 已插入值 20
  • INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?age?+?1;
  • 相當于:

  • INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20);
  • UPDATE stuInfo
  • SET age?=?age?+?1
  • WHERE id?=?1;
  • 運行結果:

  • mysql>?INSERT INTO stuInfo?(id,name,age)?VALUES?(1,'yoona',20),(1,'xiaosi',25)?ON DUPLICATE KEY UPDATE age?=?age?+?1;
  • Query?OK,?3?rows affected?(0.02?sec)
  • Records:?2?Duplicates:?1?Warnings:?0
  • mysql>?select?*?from?stuInfo;
  • +----+-------+-----+
  • |?id?|?name?|?age?|
  • +----+-------+-----+
  • |?1?|?yoona?|?21?|
  • +----+-------+-----+
  • 1?row?in?set?(0.00?sec)
  • ?

    如果遇到重復插入的數據的情形,ON DUPLICATE KEY UPDATE用來對已插入的數據進行修改,可以使用獲取重復已插入數據(直接使用字段名稱),也可以獲取重復待插入數據(values(字段名稱))。我們不會對重復待插入數據進行插入操作。

    重復已插入數據:上例中的(1,'yoona',20)

    重復待插入數據:上例中的(1,'yoona',25)

    總結

    以上是生活随笔為你收集整理的MySQL主键唯一键重复插入解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。