-- 删除重复数据,保留一条记录
-- 假设我们有一个名为 'users' 的表,其中 'email' 列存在重复数据,我们希望删除重复的记录,只保留一条。
-- 方法一:使用临时表
CREATE TEMPORARY TABLE temp_users AS
SELECT DISTINCT * FROM users;
TRUNCATE TABLE users;
INSERT INTO users
SELECT * FROM temp_users;
DROP TEMPORARY TABLE temp_users;
-- 解释:
-- 1. 创建一个临时表 'temp_users',存储 'users' 表中所有不重复的记录。
-- 2. 清空原始 'users' 表。
-- 3. 将临时表中的数据重新插入到 'users' 表中。
-- 4. 删除临时表。
-- 方法二:使用 DELETE 和 GROUP BY
DELETE t1 FROM users t1
INNER JOIN users t2
WHERE t1.id > t2.id AND t1.email = t2.email;
-- 解释:
-- 1. 使用自连接的方式,将 'users' 表与自身连接。
-- 2. 删除那些 'id' 较大的重复记录,保留 'id' 较小的记录。
-- 3. 这里的条件是 't1.id > t2.id' 和 't1.email = t2.email',确保只删除重复的记录,并保留一条。
-- 方法三:使用 ROW_NUMBER() (适用于 MySQL 8.0+)
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users
WHERE id IN (SELECT id FROM CTE WHERE rn > 1);
-- 解释:
-- 1. 使用 CTE(公用表表达式)为每个 'email' 分组,并按 'id' 排序。
-- 2. 使用 ROW_NUMBER() 函数为每个分组分配行号。
-- 3. 删除行号大于 1 的记录,即删除重复的记录,只保留每组的第一条记录。
上一篇:mysql 序号
下一篇:mysql text 大小
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站