2016-07-16 7 views
1

Ich habe eine Tabelle A mit doppelten Daten und ich möchte es normalisieren. Aber es gibt eine andere Tabelle B, die sich auf Tabelle A IDs bezieht. Es gibt keinen echten Fremdschlüssel. Es ist nur die Tatsache. Ich möchte Temp erstellen. Tabelle C und füllen Sie es durch Verwendung ON DUPLICATE KEY UPDATE, um Duplikate aus Tabelle A zu entfernen. Aber so verliere ich einige IDs, die Bezug auf Tabelle B zu Tabelle A beziehen.Mysql Funktion zum Aktualisieren von Fremdschlüssel

Ich möchte eine Funktion schreiben, die wie

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

Ist es möglich Funktion setNewId() zu machen, welche Tabelle aktualisieren C.id und B.id zu Neuer Wert bei dulicate key update?

Antwort

3

Dadurch wird C mit allen doppelten Werten von unique_field erstellt.

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

Nachdem Sie C erstellen, können Sie ein, dass B zu aktualisieren zwischen A und C, um die entsprechende ID zu finden, und verwenden Sie verwenden beizutreten.

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; 

Nachdem das erledigt ist, fallen A und benennen C-A.

+1

Er hat noch nicht einmal ein C, Barmar – Drew

+0

Er sagte, er wird C erstellen, ich denke, er weiß, wie das geht. – Barmar

+0

Nun, ich habe es trotzdem zur Antwort hinzugefügt. – Barmar

Verwandte Themen