1
resposta

Registros duplicados

Bom dia !

Para situações onde a tabela não possui registros, a criação de CONTRAINTS (PK) resolve a questão de registros duplicados. Uma dúvida que surgiu, quando temos uma tabela já existente sem PKs e com registros duplicados, como podemos eliminar apenas as DUPLICIDADES, e manter uma ÚNICA linha do registro

1 resposta

Boa tarde Willian! Tudo bem com você?

Ótima pergunta. Quando temos registros duplicados em uma tabela que já existe sem chaves primárias, o primeiro passo é identificar quais são os registros duplicados. Depois, podemos remover os registros duplicados, mantendo apenas um deles.

Preparei um script para ilustrar melhor como podemos fazer:

CREATE TABLE TB_PRODUTOS (
    ID_PRODUTO NUMBER,
    NOME_PRODUTO VARCHAR2(50),
    PRECO NUMBER
);

INSERT INTO TB_PRODUTOS (ID_PRODUTO, NOME_PRODUTO, PRECO) VALUES (1, 'Produto A', 10);
INSERT INTO TB_PRODUTOS (ID_PRODUTO, NOME_PRODUTO, PRECO) VALUES (1, 'Produto A', 10);
INSERT INTO TB_PRODUTOS (ID_PRODUTO, NOME_PRODUTO, PRECO) VALUES (2, 'Produto B', 20);
INSERT INTO TB_PRODUTOS (ID_PRODUTO, NOME_PRODUTO, PRECO) VALUES (2, 'Produto B', 20);

Ao inserir os registros nessa tabela, teremos linhas com informações duplicadas:

Imagem com da tabela após rodar os comandos de código de inserção

Para remover os registros duplicados, mantendo apenas um, faríamos:

DELETE FROM TB_PRODUTOS
WHERE ROWID NOT IN (
    SELECT MIN(ROWID)
    FROM TB_PRODUTOS
    GROUP BY ID_PRODUTO
);

Neste exemplo, ROWID é um identificador único para cada linha no Oracle. O comando DELETE remove todas as linhas que não são a primeira ocorrência de cada valor duplicado. Como resultado, temos:

Imagem após a remoção

Após remover as duplicatas, podemos adicionar a chave primária para evitar futuras duplicações:

ALTER TABLE TB_PRODUTOS
ADD CONSTRAINT PK_TB_PRODUTOS PRIMARY KEY (ID_PRODUTO);

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado