is there an equivalent of oracle's rowid in mysql?
delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
I want to make a mysql equivalent of this query!!!
What i'm trying to do is, : The my_table has no primary key.. i'm trying to delete the duplicate values and impose a primary key (composite of field1, field2)..!!
ROWID is a pseudocolumn that uniquely defines a single row in a database table. The term pseudocolumn is used because you can refer to ROWID in the WHERE clauses of a query as you would refer to a column stored in your database; the difference is you cannot insert, update, or delete ROWID values.
No, MySQL doesn't expose a ROWID type like Oracle does.
MySQL ROW_NUMBER() Function. The ROW_NUMBER() function in MySQL is used to returns the sequential number for each row within its partition. It is a kind of window function. The row number starts from 1 to the number of rows present in the partition.
In MySql you usually use session variables to achive the functionality:
SELECT @rowid:=@rowid+1 as rowid FROM table1, (SELECT @rowid:=0) as init ORDER BY sorter_field
But you can not make sorts on the table you are trying to delete from in subqueries.
UPD: that is you will need to create a temp table, insert the ranging subquery to the temp table and delete from the original table by joining with the temporary table (you will need some unique row identifier):
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
Since that is one time operation, this should not bring too much overhead.
Maybe, I am misreading the question but your query (even in Oracle) doesn't accomplish your desired goal:
delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)
MySQL equivalent is
SELECT @rowid:=max(rowid) from my_table; DELETE FROM my_table where rowid != @rowid;
This will wipe out all rows except for last one.
To perform one time cleanup (removing duplicate records) of your data you can do this:
CREATE TABLE my_table2 SELECT distinct f1, f2, f3, etc from my_table; DROP TABLE my_table; ALTER TABLE my_table2 RENAME my_table;
Then add whatever columns & keys necessary by ALTER TABLE. Above code might require to drop any foreign keys you might have.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With