2010-04-28 29 views
17

có tương đương với rowid của oracle trong mysql không?Tương đương với RowID của Oracle trong MySQL

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

Tôi muốn tạo một mysql tương đương với truy vấn này !!!

Những gì tôi đang cố gắng làm là: my_table không có khóa chính .. Tôi đang cố gắng xóa các giá trị trùng lặp và áp đặt khóa chính (tổng hợp của trường1, trường2) .. !!

Trả lời

21

Trong MySql bạn thường sử dụng các biến session để đạt được các chức năng:

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

Nhưng bạn không thể làm cho các loại trên bàn bạn đang cố gắng xóa từ trong truy vấn con.

UPD: đó là bạn sẽ cần phải tạo ra một bảng tạm thời, chèn subquery khác nhau vào bảng tạm thời và xóa từ bảng gốc bằng cách tham gia với các bảng tạm thời (bạn sẽ cần một số nhận dạng hàng độc đáo):

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 

Vì đó là thao tác một lần, điều này không được mang quá nhiều chi phí.

0

bạn có thể tránh được bảng temp sử dụng một bảng có nguồn gốc:

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

Có lẽ, tôi hiểu sai câu hỏi nhưng truy vấn của bạn (ngay cả trong Oracle) không đạt được mục tiêu mong muốn của bạn:

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

Tương đương với MySQL là

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

Thao tác này sẽ xóa tất cả các hàng ngoại trừ hàng cuối cùng.

Để thực hiện một thời gian dọn dẹp (loại bỏ dữ liệu trùng nhau) của dữ liệu của bạn, bạn có thể làm điều này:

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

Sau đó thêm bất cứ điều gì cột & phím cần thiết bằng cách ALTER TABLE. Mã trên có thể yêu cầu thả bất kỳ khóa ngoại nào mà bạn có thể có.

+0

Tôi nghĩ bạn đã đọc sai truy vấn. Nó sẽ chỉ xóa các bản sao. –

Các vấn đề liên quan