Linux

刪除重複項 - mariaDB

  • September 29, 2020

我有一個 mariaDB 數據庫,其中包含有關使用者設備的詳細資訊(類似於 VPN 訪問的“允許設備”列表)。回到項目開始時,對允許使用的設備沒有限制,所以每個人都有 2 台設備註冊到他們的名下。我的任務是從數據庫中刪除舊設備。這是一個簡化的數據庫模式:

使用者 ID|註冊日期|唯一 ID

12345|12-08-2020|ABC123

12345|11-05-2020|XYZ789

23455|20-08-2020|QWE345

要求是我必須刪除舊設備,以防使用者有兩台設備。所以在這個例子中,屬於使用者 12345 的 deviceID XYZ789 需要被刪除。

我到目前為止是這樣的:

select min(RegisterDate), UserID from DeviceDetails where RegisterDate in (select RegisterDate from DeviceDetails) group by UserID having count(*) > 1;

我知道這非常複雜,而且肯定有改進的餘地,因為在大約 14k 行上執行大約需要 3 分鐘。

下一步是將這些行導出到日誌中,然後刪除。

我不是真正的 DB 人,但是當我們從以前的供應商那裡繼承了這個產品時,它的任務就交給了我,而且到目前為止它還可以正常工作。

數據庫詳細資訊:

mysql Ver 15.1 Distrib 5.5.56-MariaDB,適用於 Linux (x86_64),使用 readline 5.1

CentOS 1810

過時了,是的,但這個決定超出了我的工資等級。

這工作得非常快,而且 14 k 不是那麼多數據

你應該添加一個唯一的約束,UserID這樣你就不必再次執行它

CREATE TABLE DeviceDetails   (
  `UserID` INTEGER,
  `RegisterDate` varchar(10),
  `UniqueID` VARCHAR(6)
);

INSERT INTO DeviceDetails  
  (`UserID`, `RegisterDate`, `UniqueID`)
VALUES
  ('12345', '12-08-2020', 'ABC123'),
  ('12345', '11-05-2020', 'XYZ789'),
  ('23455', '20-08-2020', 'QWE345');
delete d from 
DeviceDetails d
inner join (
    select max(`RegisterDate`) as maxdate, `UserID` from DeviceDetails 
    group by `UserID` 
    having count(*) > 1
) u on u.`UserID` = d.`UserID` and u.maxdate != d.`RegisterDate`;
SELECT * FROM DeviceDetails;
使用者名 | 註冊日期 | 唯一身份
-----: | :----------- | :-------
 12345 | 12-08-2020 | ABC123 
 23455 | 20-08-2020 | QWE345 

db<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/276238