2010-04-28 62 views
17

在mysql中是否有相当于oracle的rowid?MySQL中的Oracle的RowID的等价形式

delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)

我想打一个mysql相当于此查询的!

我想要做的是,:my_table没有主键..我试图删除重复的值,并强加一个主键(复合field1,field2)..!

回答

21

在MySQL中,你通常使用会话变量才达到的功能:

SELECT @rowid:[email protected]+1 as rowid 
FROM table1, (SELECT @rowid:=0) as init 
ORDER BY sorter_field 

但你不能让你尝试从子查询中删除排序在桌子上。

UPD:那就是你需要创建一个临时表,插入测距子查询的临时表,并通过与临时表连接从原始表中删除(你需要一些独特的行标识符):

CREATE TEMPORARY TABLE duplicates ... 

INSERT INTO duplicates (rowid, field1, field2, some_row_uid) 
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 testruns t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init 
ORDER BY field1, field2 DESC; 

DELETE FROM my_table USING my_table JOIN duplicates 
    ON my_table.some_row_uid = duplicates.some_row_uid AND duplicates.rowid > 0 

既然这是一次性操作,这不应该带来太多的开销。

0

您可以使用其他派生表避免临时表:

DELETE FROM my_table USING my_table JOIN (
    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 testruns t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init 
    ORDER BY field1, field2 DESC) as duplicates 
ON my_table.some_row_uid = duplicates.some_row_uid AND duplicates.rowid > 0 
1

也许,我误读的问题,您的查询(即使是在甲骨文)不会达到你想要的目标:

delete from my_table where rowid not in (select max(rowid) from 
my_table group by field1,field2) 

MySQL的等价物是

SELECT @rowid:=max(rowid) from my_table; 
DELETE FROP my_table where rowid != @rowid; 

这将消灭所有行,除了最后一个。

要对数据执行的一次清理(删除重复记录),你可以这样做:

CREATE TABLE my_table2 SELECT distinct f1, f2, f3, etc from my_table; 
DROP TABLE my_table; 
ALTER TABLE my_table2 RENAME my_table; 

然后添加任何&密钥必须通过ALTER TABLE列。上面的代码可能需要删除您可能拥有的任何外键。

+0

我认为你误读了查询。它只会删除重复项。 – 2012-05-08 19:44:41