テーブルには、id、name、count の 3 つの列があります。かなりの数の名前列が同一であり (早期に UNIQUE がないため)、これを修正したいと考えています。ただし、id列は他の(4または5、私は思う-ドキュメントを確認する必要がある)テーブルで名前を検索するために使用されており、それらを削除するだけで問題が発生します。それで、「すべての同一のレコードを見つけて、それらをマージする」と言う良い、きれいな方法はありますか?
Thomas Owens
質問する
464 次
2 に答える
4
この種の質問は時々出てきます。いいえ、本当にきれいな方法はありません。親テーブルの不要な行を削除する前に、親テーブルの不要な値に依存する子テーブルのすべての行を変更する必要があります。
MySQL はマルチテーブルUPDATE
とDELETE
ステートメントをサポートしているため (他のブランドのデータベースとは異なり)、次のような非常に巧妙なトリックを実行できます。
UPDATE names n1
JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name)
JOIN child_table c ON (n2.id = c.id)
SET c.name_id = n1.id
ORDER BY n1.id DESC;
すべての子テーブルでこれを実行したら、MySQL の複数テーブルDELETE
構文を使用して、親テーブルの不要な行を削除できます。
DELETE FROM n2
USING names n1 JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name);
于 2008-10-31T18:02:39.290 に答える
0
どうしてこんなことができないの?
update dependent_table set name_id = <id you want to keep> where name_id in (
select id from names where name = 'foo' and id != <id you want to keep>)
于 2008-10-31T17:48:32.033 に答える