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中文网其他相关文章!