Maison > base de données > tutoriel mysql > Comment supprimer les lignes en double d'une table PostgreSQL tout en préservant une colonne unique ?

Comment supprimer les lignes en double d'une table PostgreSQL tout en préservant une colonne unique ?

Mary-Kate Olsen
Libérer: 2025-01-19 02:43:10
original
113 Les gens l'ont consulté

How to Delete Duplicate Rows from a PostgreSQL Table While Preserving a Unique Column?

Supprimer les lignes en double d'un petit tableau avec des colonnes uniques

Dans les bases de données PostgreSQL, l'élimination des lignes en double peut améliorer l'intégrité des données et optimiser les performances. Supposons que vous ayez une table contenant des lignes sans contrainte et des données en double, en particulier dans une colonne spécifique appelée « clé ». L'objectif est de supprimer les doublons et de conserver une seule instance de chaque valeur « clé » unique.

Solution de commande SQL unique

Pour ce faire avec une seule commande SQL, vous pouvez suivre les étapes suivantes :

1. Identifiez la première occurrence répétée : Tout d’abord, nous devons identifier la première occurrence de chaque ligne répétée. Ces informations sont essentielles pour conserver une seule copie des données.

<code class="language-sql">SELECT MIN(ctid) AS ctid, key
FROM dups
GROUP BY key HAVING COUNT(*) > 1;</code>
Copier après la connexion

2. Supprimer la non-première occurrence : Une fois la première occurrence identifiée, nous pouvons supprimer tous les doublons suivants en fonction de leur valeur « ctid ». La colonne "ctid" représente l'emplacement physique de la ligne dans le tableau.

<code class="language-sql">DELETE FROM dups a USING (
    SELECT MIN(ctid) AS ctid, key
    FROM dups
    GROUP BY key HAVING COUNT(*) > 1
) b
WHERE a.key = b.key
AND a.ctid <> b.ctid;</code>
Copier après la connexion

Considérez la commande en ligne

Bien que cette méthode supprime efficacement les doublons, elle ne garantit pas quelle ligne est conservée en cas d'occurrences multiples. S'il existe des critères spécifiques pour sélectionner les lignes à conserver, ils doivent être incorporés dans la requête.

Exemple :

Pour une meilleure compréhension, considérons l'exemple suivant :

<code class="language-sql">CREATE TABLE people (
    name    VARCHAR(50) NOT NULL,
    surname VARCHAR(50) NOT NULL,
    age     INTEGER NOT NULL
);

INSERT INTO people (name, surname, age) VALUES
    ('A.', 'Tom', 30),
    ('A.', 'Tom', 10),
    ('B.', 'Tom', 20),
    ('B', 'Chris', 20);

-- 显示重复项的第一次出现:
SELECT MIN(ctid) AS ctid, name, surname
FROM people
GROUP BY (name, surname) HAVING COUNT(*) > 1;

-- 删除重复项的非第一次出现:
DELETE FROM people a USING (
    SELECT MIN(ctid) AS ctid, name, surname
    FROM people
    GROUP BY (name, surname) HAVING COUNT(*) > 1
) b
WHERE a.name = b.name
AND a.surname = b.surname
AND a.ctid <> b.ctid;

SELECT * FROM people;</code>
Copier après la connexion

Cet exemple de tableau contient des données personnelles potentiellement en double. Après l'exécution de la deuxième requête, les doublons sont supprimés et seuls les prénoms et noms uniques restent dans la table.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal