2016-07-16 6 views
1

テーブルがありますデータが重複しており、正規化したいと思います。しかし、別のテーブルBがあり、これはテーブルAを指します。実際の外部キーはありません。それは事実だけです。私は一時を作成したいと思います。テーブルCを使用して重複キー更新で記入して、テーブルAから重複を削除してください。しかし、テーブルBからテーブルAへの参照を作成するいくつかのIDを失います。にテーブルC.idB.idを更新します私は外部キーを更新するMysql関数

ON DUPLICATE KEY UPDATE id = setNewId(`id`, VALUES(`id`)) 

のように呼び出される関数は、関数setNewIdを(作ることが可能です書きたい

二値キー更新の新しい値?

答えて

3

これにより、unique_fieldの重複値がすべて削除されたCが作成されます。

CREATE TABLE C LIKE A; 
ALTER TABLE C ADD UNIQUE INDEX (unique_field); 
INSERT IGNORE INTO C 
SELECT * FROM A; 

あなたがCを作成した後、対応するIDを見つけることAC間の結合、およびBを更新するためにそれを使用を使用することができます。それは完了だ後

UPDATE B 
JOIN A ON B.foreign_key = A.id 
JOIN C ON C.unique_field = A.unique_field AND C.id != A.id 
SET B.foreign_key = C.id; 

AをドロップしACの名前を変更します。

+1

彼はまだCを持っていない、Barmar – Drew

+0

彼は彼がCを作成しようとしている、彼はそれを行う方法を知っていると思う。 – Barmar

+0

まあ、とにかく答えに加えました。 – Barmar