Mysql中如何刪除表重復(fù)數(shù)據(jù)
根據(jù)多個(gè)字段刪除重復(fù)數(shù)據(jù),只保留一條數(shù)據(jù)
DELETEFROMtable_name WHERE(字段1, 字段2) IN (SELECTt.字段1,t.字段2FROM(SELECT字段1,字段2FROMtable_name GROUP BY字段1,字段2HAVINGcount(1) > 1) t)AND id NOT IN (SELECTdt.idFROM(SELECTmin(id) AS idFROMtable_name GROUP BY字段1,字段2HAVINGcount(1) > 1) dt)沒有主鍵時(shí)刪除重復(fù)數(shù)據(jù)1、創(chuàng)建新表
①創(chuàng)建一個(gè)新表與目標(biāo)表結(jié)構(gòu)字段保持一致
create table new_table_temp②將過濾查詢的統(tǒng)計(jì)的數(shù)據(jù)寫入到新表
insert into new_table_temp③將舊表table_name 刪除
delete from table_name?④將創(chuàng)建的新表名稱修改為舊表名稱
2、添加字段
①表結(jié)構(gòu)添加一個(gè)自增且唯一字段
②按照存在唯一主鍵進(jìn)行刪除重復(fù)數(shù)據(jù)
③刪除添加的自增字段
Mysql刪除表中重復(fù)數(shù)據(jù)并保留一條最近有個(gè)需求,給角色添加菜單權(quán)限,這是一個(gè)role_menu 表。
里面存放的是角色id和菜單id,是批量給一種類型角色添加,但有可能角色人為添加過,因?yàn)閿?shù)據(jù)量還是比較大的,如果先查詢這個(gè)有沒有添加過再添加會(huì)很耗時(shí),而統(tǒng)一不管有沒有添加過一并添加則很快,這就需要后續(xù)給重復(fù)數(shù)據(jù)給刪除掉,于是有了今天的分享。
我這里只做一個(gè)列子,工作代碼安全底線大家謹(jǐn)記哈。
準(zhǔn)備一張表 用的是mysql8 大家自行更改/* Navicat Premium Data Transfer Source Server : localmysql Source Server Type : MySQL Source Server Version : 80030 Source Host : localhost:3306 Source Schema : nie_db Target Server Type : MySQL Target Server Version : 80030 File Encoding : 65001 Date: 17/08/2022 10:49:41*/SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Table structure for message-- ----------------------------DROP TABLE IF EXISTS `message`;CREATE TABLE `message` ( `id` bigint(0) NOT NULL, `message_title` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL, `message_context` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL, `send_peo` bigint(0) NULL DEFAULT NULL, `receive_peo` bigint(0) NULL DEFAULT NULL, `scope` int(0) NULL DEFAULT 0, `del_flag` tinyint(0) NULL DEFAULT 0, `create_time` datetime(0) NULL DEFAULT NULL, `creator` tinyint(0) NULL DEFAULT NULL, `update_time` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;-- ------------------------------ Records of message-- ----------------------------INSERT INTO `message` VALUES (1, '測試消息', '消息內(nèi)容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');INSERT INTO `message` VALUES (2, '測試消息', '消息內(nèi)容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');INSERT INTO `message` VALUES (3, '測試消息', '消息內(nèi)容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');INSERT INTO `message` VALUES (4, '測試消息', '消息內(nèi)容', 23, 1231, 0, 0, '2022-08-17 10:39:51', 3, '2022-08-17 10:40:00');SET FOREIGN_KEY_CHECKS = 1;創(chuàng)建表并添加四條相同的數(shù)據(jù)接下來是我們這次的重頭,我封裝了一個(gè)存儲(chǔ)過程,具體的邏輯都在注釋里了,你也可以分析然后單獨(dú)拿出來分批次執(zhí)行sql
另外創(chuàng)建存儲(chǔ)過程,就是再函數(shù)那里右鍵 -》過程-》輸入名字-》完成 ,你也可以百度下怎么創(chuàng)建的,我這里就不說太多啦。
總結(jié)以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
