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:
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:
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