sql >> Database >  >> RDS >> Mysql

Equivalent van Oracle's RowID in MySQL

In MySql gebruik je meestal sessievariabelen om de functionaliteit te bereiken:

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

Maar u kunt de tabel waaruit u probeert te verwijderen niet sorteren in subquery's.

UPD :dat wil zeggen dat u een tijdelijke tabel moet maken, de variërende subquery in de tijdelijke tabel moet invoegen en uit de originele tabel moet verwijderen door deze samen te voegen met de tijdelijke tabel (u hebt een unieke rij-ID nodig):

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

Aangezien dat een eenmalige operatie is, zou dit niet te veel overhead met zich mee moeten brengen.



  1. JSON_CONTAINS() Voorbeelden in MySQL

  2. PostgreSQL verkeerde conversie van tijdstempel zonder tijdzone naar tijdstempel met tijdzone

  3. Preventietriggers

  4. Een mysql-database met meerdere tenants ontwerpen