在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)..!
在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)..!
在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
既然这是一次性操作,这不应该带来太多的开销。
您可以使用其他派生表避免临时表:
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
也许,我误读的问题,您的查询(即使是在甲骨文)不会达到你想要的目标:
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列。上面的代码可能需要删除您可能拥有的任何外键。
我认为你误读了查询。它只会删除重复项。 – 2012-05-08 19:44:41