Buscar y eliminar registros duplicados en una base de datos en PostgreSQL

Bilal Shahid 20 junio 2023
  1. Esquema de base de datos PostgreSQL
  2. Estado de la base de datos PostgreSQL
  3. Encuentra registros duplicados en PostgreSQL
  4. Eliminar registros duplicados en PostgreSQL
  5. Conclusión
Buscar y eliminar registros duplicados en una base de datos en PostgreSQL

Este artículo describe cómo encontrar y eliminar registros duplicados en PostgreSQL usando diferentes comandos.

Se pueden escribir y utilizar numerosas consultas para buscar registros duplicados en la base de datos. Luego, las mismas consultas se pueden modificar para eliminar los registros duplicados en la base de datos.

Algunas de las consultas se mencionan a continuación para ayudarlo a encontrar registros duplicados. Existen varias consultas alternativas para el mismo propósito, por lo que puede seguir experimentando y encontrando nuevas soluciones.

Esquema de base de datos PostgreSQL

Se seguirá un esquema diseñado a continuación a lo largo del artículo para permitirle concentrarse solo en las consultas. Todas las consultas están diseñadas de acuerdo con el esquema para comprender mejor el funcionamiento de las consultas.

CREATE TABLE Student (
    sid INT PRIMARY KEY,
    sname VARCHAR (50),
    sage INT,
    semail VARCHAR(80)
);

Estado de la base de datos PostgreSQL

Los siguientes registros se agregan a la tabla Estudiante para llenarlos con registros.

INSERT INTO Student VALUES (1, 'A', 15, 'a@gmail.com');
INSERT INTO Student VALUES (2, 'A', 17, 'ab@gmail.com');
INSERT INTO Student VALUES (3, 'B', 17, 'b@gmail.com');
INSERT INTO Student VALUES (4, 'AB', 21, 'ab@gmail.com');

El esquema y el estado de la base de datos muestran claramente que solo la columna sid de la tabla es única; de lo contrario, todas las columnas pueden contener registros duplicados.

El estado de la tabla Estudiante después de la inserción exitosa de todos los registros se muestra a continuación:

Estado del estudiante

Se pueden ver valores duplicados en sname, sage y semail.

Encuentra registros duplicados en PostgreSQL

Se generará un error si aplica una restricción única en una columna que ya contiene registros duplicados. Tener diferentes registros para aplicar una restricción única en ese atributo más tarde es esencial.

Puede haber varias otras razones para encontrar registros duplicados. Puede escribir consultas en PostgreSQL para filtrar registros duplicados.

Aquí están las siguientes consultas:

Consulta 1

Una consulta muy básica que puede ayudarlo a encontrar registros duplicados es la siguiente:

SELECT sname, count(*)
FROM Student
GROUP BY sname
HAVING count(*) >1

La consulta anterior es bastante básica. Agrupa los datos según la columna sname y muestra el número de veces que encuentra un alumno con el mismo nombre.

El resultado de la consulta es el siguiente:

PostgreSQL Buscar duplicados - Consulta 1

Nota: Si desea verificar duplicados en la columna sage, reemplácelo con la columna sname en la consulta. Además, si desea encontrar un registro duplicado con el mismo nombre y edad, agregue ambas columnas a la consulta.

Consulta 2

Si conoce bien las consultas anidadas, esta podría ser una solución fácil para comprobar si hay valores duplicados. Es una consulta similar a la escrita arriba; sin embargo, incluye el concepto de consultas anidadas:

SELECT *
FROM Student ou
WHERE (
    SELECT count(*)
    FROM Student inr
    WHERE inr.sname = ou.sname
) > 1

La consulta proporciona el mismo resultado que se esperaba. Muestra el registro completo del sname que tiene registros duplicados.

Si desea encontrar registros duplicados en otros atributos, puede reemplazar el sname en la consulta anterior con el atributo de su elección.

El resultado generado a partir de la consulta es el siguiente:

PostgreSQL Buscar duplicados - Consulta 2

Consulta 3

Para encontrar registros duplicados completos que tengan el mismo valor en cada atributo, aquí hay una consulta simple:

SELECT (Student.*)::text, count(*)
FROM Student
GROUP BY Student.*
HAVING count(*) > 1

La consulta anterior toma todos los atributos. En este caso, tomará sid, sname, sage y semail y cuenta el número de veces que se repite el mismo registro con valores exactos en todos los atributos.

En este esquema, el atributo sid es la clave principal; por lo tanto, no permite la duplicación completa de registros. Por lo tanto, la consulta no genera ningún resultado:

PostgreSQL Buscar duplicados - Consulta 3

consulta 4

A continuación se menciona otra consulta que se puede utilizar para encontrar registros duplicados en una tabla específica:

SELECT *
FROM (
    SELECT sname, sage, semail, ROW_NUMBER() OVER
        (
        PARTITION BY sname
        ORDER BY sname, sage, semail ASC
        ) AS Row FROM Student
    ) dups
WHERE dups.Row >1

Esta es una consulta anidada que encuentra filas duplicadas y muestra el “nombre”, “sabio” y “correo electrónico” de los registros duplicados. El resultado de la consulta es el siguiente:

PostgreSQL Buscar duplicados - Consulta 4

Eliminar registros duplicados en PostgreSQL

Después de encontrar los registros duplicados, es posible que desee eliminarlos de la tabla. Se pueden utilizar varias consultas para eliminar registros duplicados; sin embargo, este artículo incluye solo una consulta de este tipo.

Consulta 1

Las cuatro consultas mencionadas anteriormente se pueden usar ajustando para eliminar registros duplicados. Puede probar y experimentar con esas consultas usted mismo como ejercicio.

Hemos incluido otra consulta para eliminar los registros duplicados de la tabla de este artículo.

DELETE
FROM Student s1
USING Student s2
WHERE s1.sname = s2.sname AND s1.sid < s2.sid

La consulta anterior elimina un registro de la tabla Estudiante con el nombre A. La consulta elimina todos los registros excepto el último y genera un mensaje de éxito.

El estado de la tabla después de la eliminación se puede ver a continuación:

PostgreSQL Eliminar duplicados

Conclusión

Se pueden utilizar numerosas consultas para encontrar registros duplicados en una base de datos. Ajustar esas consultas también puede ayudarlo a eliminar esos registros.

Siga experimentando con diferentes consultas para encontrar la que mejor se adapte a sus necesidades.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Artículo relacionado - PostgreSQL Database