首页 > 数据库 > mysql教程 > 如何在没有ROWID的MySQL中删除重复行并添加复合主键?

如何在没有ROWID的MySQL中删除重复行并添加复合主键?

DDD
发布: 2024-12-07 06:35:12
原创
919 人浏览过

How to Delete Duplicate Rows and Add a Composite Primary Key in MySQL Without ROWID?

MySQL 中 Oracle ROWID 的替代方案,用于删除重复值和施加复合主键

Oracle 的 ROWID 为表中的每一行提供唯一标识符桌子。然而,在 MySQL 中,没有与 ROWID 完全相同的对象。

对于提供的查询:

delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
登录后复制

其目的是根据特定列删除重复行,然后强加主键, MySQL 中有不同的方法。

临时表和唯一标识符:实现所需结果的一种方法是通过使用临时表。创建一个具有唯一行标识符(例如,some_row_uid)的临时表,并将所需的数据插入其中。然后,将原始表与临时表连接起来,以识别并删除重复的行。

会话变量:或者,会话变量可用于有效地为每行生成运行计数创建伪 ROWID。然而,在子查询中操作同一个表时,这种方法可能会遇到限制。

使用临时表的示例查询(MySQL 8 语法):

CREATE TEMPORARY TABLE duplicates AS
SELECT
  @rowid:=IF(@f1=field1 AND @f2=field2, @rowid+1, 0) as rowid,
  @f1:=field1 as field1,
  @f2:=field2 as field2,
  some_row_uid
FROM my_table t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init
ORDER BY field1, field2 DESC;

DELETE my_table FROM my_table
INNER JOIN duplicates ON my_table.some_row_uid = duplicates.some_row_uid
WHERE duplicates.rowid > 0;

ALTER TABLE my_table ADD PRIMARY KEY (field1, field2);
登录后复制

这种方法可能会由于创建和操作临时表而引入一些开销。对于一次性操作,应该提供合理的解决方案。

以上是如何在没有ROWID的MySQL中删除重复行并添加复合主键?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板