Linux
刪除重複項 - mariaDB
我有一個 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<>在這裡擺弄