Следните опции могат да се използват за изтриване на дублиращи се редове в SQLite.
Тези примери изтриват дублиращи се редове, но запазват един. Така че, ако има три еднакви реда например, той изтрива два от тях и запазва един. Това често се нарича премахване на дупли на масата.
Примерни данни
Да предположим, че имаме таблица със следните данни:
SELECT * FROM Pets;
Резултат:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Можем да видим, че първите два реда са дублирани, както и последните три реда.
В този случай всички колони са дублирани. Няма първичен ключ. PetId
колоната може да изглежда сякаш може да е първичен ключ, но всъщност съдържа дублиращи се стойности. Следователно, това не е уникален идентификатор за всеки ред и не може да се използва като първичен ключ.
Ако имаше първичен ключ, той щеше да съдържа уникални стойности във всички редове и нямаше да има дубликати.
Във всеки случай, по-долу са две опции за намиране и изтриване на дублиращи се редове.
Опция 1
Преди да премахнем дублирането на таблицата, можем да използваме следната заявка, за да видим кой ред/и ще бъдат изтрити:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
Резултат:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Това ни показва, че три реда ще бъдат изтрити, когато премахнем дублирането на таблицата в следващата стъпка.
За да изтрием дублиращите се стойности, можем да променим горната заявка, като заменим SELECT *
с DELETE
:
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
Резултат:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Таблицата вече е премахната.
Както се очакваше, един от дублиращите се редове за нашето куче „Wag” е изтрит, а другият остава. Два от дублиращите се редове за „Кора“ също бяха изтрити.
Причината, поради която успяхме да направим това, е поради rowid
на SQLite . По подразбиране всеки ред в SQLite има специална колона, обикновено наричана rowid
, който уникално идентифицира този ред в таблицата. Освен ако не е премахнат изрично от таблицата, можете да го използвате като уникален идентификатор за всеки ред, което ни позволява да изградим горните заявки. Същото важи и за следващия пример.
Опция 2
Ако приемем, че таблицата е била възстановена с оригиналните си данни (включително дублиращи се редове), ето още една опция за премахването й.
Проверете кои редове ще бъдат изтрити:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Резултат:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Сега изтрийте тези редове:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Резултат:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Таблицата е премахната.