Tenho uma tabela de banco de dados MySQL com duas colunas que me interessam. Individualmente, cada um deles pode ter duplicatas, mas nunca deve haver uma duplicata de AMBOS com o mesmo valor.
stone_id
pode ter duplicatas, desde que cada upsharge
título seja diferente e ao contrário. Mas digamos, por exemplo, stone_id
= 412 e upcharge_title
= "safira", essa combinação deve ocorrer apenas uma vez.
Isso está ok:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "ruby"
Isso NÃO está ok:
stone_id = 412 upcharge_title = "sapphire"
stone_id = 412 upcharge_title = "sapphire"
Existe uma consulta que localizará duplicatas em ambos os campos? E se possível, há uma maneira de definir meu banco de dados para não permitir isso?
Estou usando o MySQL versão 4.1.22
fonte
Achei útil adicionar um índice exclusivo usando um "ALTER IGNORE" que remove as duplicatas e impõe registros exclusivos, o que parece que você gostaria de fazer. Portanto, a sintaxe seria:
Isso efetivamente adiciona a restrição exclusiva, o que significa que você nunca terá registros duplicados e o IGNORE exclui as duplicatas existentes.
Você pode ler mais sobre eh ALTER IGNORE aqui: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
Update: Fui informado por @Inquisitive que isso pode falhar nas versões do MySql> 5.5:
Atualização -
ALTER IGNORE
Removido em 5.7Dos documentos
Um dos desenvolvedores do MySQL oferece duas alternativas :
INSERT IGNORE
, por exemplo:Mas dependendo do tamanho da sua mesa, isso pode não ser prático
fonte
Você pode encontrar duplicatas como esta ..
fonte
Para encontrar as duplicatas:
Para evitar isso no futuro, crie uma chave única composta nesses dois campos.
fonte
A propósito, uma restrição única composta na tabela evitaria que isso ocorresse em primeiro lugar.
(Este é um T-SQL válido. Não tenho certeza sobre o MySQL.)
fonte
este post do SO me ajudou, mas eu também queria saber como excluir e manter uma das linhas ... aqui está uma solução PHP para excluir as linhas duplicadas e manter uma (no meu caso, havia apenas 2 colunas e está em um função para limpar associações de categoria duplicadas)
o (limite NUM_DUPES - 1) é o que preserva a única linha ...
obrigado a todos
fonte
ALTER IGNORE TABLE table ADD UNIQUE INDEX index_name(stone_id, charge_title)
irá remover linhas duplicadas, deixando apenas um par exclusivo.