最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql刪除重復(fù)數(shù)據(jù)并且只保留一條(附實(shí)例!)

 更新時(shí)間:2023年02月01日 16:06:54   作者:怪?咖@  
最近有朋友打電話尋求一個(gè)SQL相關(guān)的問題,大致是表中存在重復(fù)數(shù)據(jù),需要?jiǎng)h除掉重復(fù)數(shù)據(jù)保留一條的場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Mysql刪除重復(fù)數(shù)據(jù)并且只保留一條的相關(guān)資料,需要的朋友可以參考下

(1)以這張表為例:

CREATE TABLE `test`  (
  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '注解id',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名字',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

INSERT INTO test (id,`name`) VALUES (replace(uuid(),'-',''),'張三'),(replace(uuid(),'-',''),'張三');

表里有兩條數(shù)據(jù),然后名字是相同的,但是id是不同的,現(xiàn)在要求是只留一條數(shù)據(jù):

(2)查詢name值重復(fù)的數(shù)據(jù):

現(xiàn)實(shí)開發(fā)當(dāng)中可能一個(gè)字段無(wú)法鎖定重復(fù)值,可以采取group by多個(gè)值!利用多個(gè)值來鎖定重復(fù)的行數(shù)據(jù)!

SELECT name FROM test GROUP BY `name` HAVING count( name ) > 1

(3)查詢重復(fù)數(shù)據(jù)里面每個(gè)最小的id:

SELECT min(id) as id FROM test GROUP BY `name` HAVING count( name ) > 1

(4)查詢?nèi)サ糁貜?fù)數(shù)據(jù)最小id的其他數(shù)據(jù):也就是要?jiǎng)h除的數(shù)據(jù)!

SELECT * FROM test 
WHERE name IN ( SELECT name FROM test GROUP BY `name` HAVING count( name ) > 1 ) 
AND 
id NOT IN (SELECT min( id ) FROM test GROUP BY `name` HAVING count( NAME ) > 1)

(5)刪除去掉重復(fù)數(shù)據(jù)最小id的其他數(shù)據(jù):

可能這時(shí)候有人該說了,有了查詢,直接改成delete不就可以了,真的是這樣嗎?其實(shí)不是的,如下運(yùn)行報(bào)錯(cuò):

首先明確一點(diǎn)這個(gè)錯(cuò)誤只會(huì)發(fā)生在delete語(yǔ)句或者update語(yǔ)句,拿update來舉例 : update A表 set A列 = (select B列 from A表); 這種寫法就會(huì)報(bào)這個(gè)錯(cuò)誤,原因:你又要修改A表,然后又要從A表查數(shù)據(jù),而且還是同層級(jí)。Mysql就會(huì)認(rèn)為是語(yǔ)法錯(cuò)誤!

嵌套一層就可以解決,update A表 set A列 = (select a.B列 from (select * from A表) a); 當(dāng)然這個(gè)只是個(gè)示例,這個(gè)示例也存在一定的問題,比如(select a.B列 from (select * from A表) a)他會(huì)查出來多條,然后賦值的時(shí)候會(huì)報(bào) 1242 - Subquery returns more than 1 row

嵌套一層他就可以和update撇清關(guān)系,會(huì)優(yōu)先查括號(hào)里面的內(nèi)容,查詢結(jié)果出來過后會(huì)給存起來,類似臨時(shí)表,可能有的人該好奇了,update A表 set A列 = (select B列 from A表); 我明明加括號(hào)了呀,難道不算嵌套嗎,當(dāng)然不算,那個(gè)括號(hào)根本沒有解決他們之間的層次關(guān)系!

詳解看這篇文章:http://m.fzitv.net/article/274025.htm

(6)正確的寫法:

方式一:

DELETE FROM test 
WHERE name IN ( select a.name from (SELECT name FROM test GROUP BY `name` HAVING count( name ) > 1) a) 
AND 
id NOT IN (select a.id from (SELECT  min(id) as id FROM test GROUP BY `name` HAVING count( name ) > 1) a)

注意:刪除之前一定要先查詢,然后再刪除,否則一旦語(yǔ)法有問題導(dǎo)致刪了不想刪除的數(shù)據(jù),想要恢復(fù)很麻煩!或者刪除前備份好數(shù)據(jù),不要嫌麻煩,一旦出問題,才是真正的大麻煩!

方式二:

DELETE FROM test 
WHERE
	id NOT IN (
	SELECT
		t.id 
FROM
	( SELECT MIN(id) as id FROM test GROUP BY NAME ) t)

(7)錯(cuò)誤的寫法: 這塊我吃過一次虧,所以專門寫出來,避免踩坑!

千萬(wàn)千萬(wàn)不能這么搞,下面這個(gè)語(yǔ)法相當(dāng)于是先按name分組,然后查出來大于1的,這時(shí)候假如大于1的有很多,然后外面嵌套的那一層,只取了最小的一條數(shù)據(jù),然后再加上使用的是NOT IN,最終會(huì)導(dǎo)致數(shù)據(jù)全部被刪除!??!

執(zhí)行前有四條數(shù)據(jù),實(shí)際上我們要的是張三留下來一條,然后李四留下來一條

執(zhí)行結(jié)果:只留下了一條!

總結(jié)

到此這篇關(guān)于Mysql刪除重復(fù)數(shù)據(jù)并且只保留一條的文章就介紹到這了,更多相關(guān)Mysql刪除重復(fù)數(shù)據(jù)只保留一條內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql在update,非主鍵索引更新引起死鎖問題

    mysql在update,非主鍵索引更新引起死鎖問題

    這篇文章主要介紹了mysql在update,非主鍵索引更新引起死鎖問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • node連接mysql數(shù)據(jù)庫(kù)遇到的問題和解決方案

    node連接mysql數(shù)據(jù)庫(kù)遇到的問題和解決方案

    這篇文章主要介紹了node連接mysql數(shù)據(jù)庫(kù)遇到的問題和解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • MySQL中row_number的實(shí)現(xiàn)過程

    MySQL中row_number的實(shí)現(xiàn)過程

    這篇文章主要介紹了MySQL中row_number的實(shí)現(xiàn)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • php 不能連接數(shù)據(jù)庫(kù) php error Can''t connect to local MySQL server

    php 不能連接數(shù)據(jù)庫(kù) php error Can''t connect to local MySQL server

    php 不能連接數(shù)據(jù)庫(kù) php error Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    2011-05-05
  • MySQL CPU過高的排查方法

    MySQL CPU過高的排查方法

    這篇文章主要介紹了MySQL CPU過高的排查方法,通過top命令查看服務(wù)器CPU資源使用情況,明確CPU占用率較高的是否是mysqld進(jìn)程,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • MySQL8.0 MGR的維護(hù)管理

    MySQL8.0 MGR的維護(hù)管理

    數(shù)據(jù)庫(kù)已成為企業(yè)和管理員們最為關(guān)注的核心組件之一,本文主要介紹了MySQL8.0 MGR的維護(hù)管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • java實(shí)現(xiàn)mysql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式

    java實(shí)現(xiàn)mysql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式

    在實(shí)際開發(fā)中,每條數(shù)據(jù)的創(chuàng)建時(shí)間和修改時(shí)間,盡量不需要應(yīng)用程序去記錄,而由數(shù)據(jù)庫(kù)獲取當(dāng)前時(shí)間自動(dòng)記錄創(chuàng)建時(shí)間,本文主要介紹了java實(shí)現(xiàn)mysql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式,感興趣的可以了解一下
    2024-01-01
  • MySql 修改密碼后的錯(cuò)誤快速解決方法

    MySql 修改密碼后的錯(cuò)誤快速解決方法

    今天在MySql5.6操作時(shí)報(bào)錯(cuò):You must SET PASSWORD before executing this statement解決方法,需要的朋友可以參考下
    2016-11-11
  • MYSQL大數(shù)據(jù)導(dǎo)入

    MYSQL大數(shù)據(jù)導(dǎo)入

    MYSQL大數(shù)據(jù)導(dǎo)入...
    2006-11-11
  • php+mysql prepare 與普通查詢的性能對(duì)比實(shí)例講解

    php+mysql prepare 與普通查詢的性能對(duì)比實(shí)例講解

    prepare可以解決大訪問量的網(wǎng)站給數(shù)據(jù)庫(kù)服務(wù)器所帶來的負(fù)載和開銷,本文章通過實(shí)例向大家介紹預(yù)查詢prepare與普通查詢的性能對(duì)比,需要的朋友可以參考一下
    2016-11-11

最新評(píng)論

肥西县| 临海市| 临桂县| 济阳县| 库车县| 盐城市| 浦江县| 凭祥市| 岑巩县| 根河市| 林西县| 阿图什市| 贺州市| 日喀则市| 晴隆县| 卢氏县| 保康县| 大新县| 资兴市| 桐乡市| 庆阳市| 交口县| 玛多县| 天全县| 河源市| 阜城县| 武定县| 三门峡市| 襄汾县| 凤冈县| 土默特右旗| 西平县| 宁阳县| 天津市| 平度市| 安仁县| 姚安县| 杂多县| 达拉特旗| 郁南县| 上思县|