2016-07-27 4 views
2

Ich habe eine Tabelle mit Daten in "Unternehmen" und eine neue Tabelle namens "Tabelle 9", die durch einen Import gekommen ist. Ich versuche, die Tabelle 9 Daten in Unternehmen zu migrieren, aber ich muss sicherstellen, dass es nicht bereits existiert. Ich habe keine andere Wahl, als das Leben zu laufen (Ich habe ein Backup)Überprüfen der Daten vor dem Importieren von MySQL

Dies ist mein Code so weit:

INSERT INTO businesses 

(Business, Address1,Address2,Address3,Town,Postcode,BusinessType,Contact,Position,Telephone) 

SELECT Company, 

line1, 

line2, 

line3, 

town, 

postcode, 

trade, 

(SELECT CONCAT(`ContactSalutation`, ' ', `ContactFirstName`, ' ', `ContactLastName`) FROM telesales.`table 9`), 

ContactPosition, 

phoneno pnum 

FROM telesales.`table 9` ts 

where pnum NOT IN (SELECT DISTINCT Telephone 

         FROM businesses 

         WHERE Telephone = pnum) 

Zum einen wird dies tun würde, was ich erwarten? nur einfügen, wenn die Telefonnummer in Tabelle 9 nicht in der Unternehmenstabelle existiert, und gibt es eine Möglichkeit zu sagen, ob sie existiert, und sie stattdessen mit den neuen Daten aktualisiert?

Antwort

1

Erstens

(SELECT CONCAT(`ContactSalutation`, ' ', `ContactFirstName`, ' ', `ContactLastName`) FROM telesales.`table 9`), 

mit ziemlicher Sicherheit ist nicht das, was Sie wollen. Sie sagen: "Holen Sie all diese Informationen aus Tabelle 9 und fügen Sie sie in Unternehmen ein", ohne eine Join- oder Where-Klausel. Ich bin mir nicht sicher, wie MySQL darauf reagiert, aber der beste Fall ist, dass Sie eine zufällige Zeile erhalten, nicht die Zeile, die mit der Zeile verknüpft ist, die Sie einfügen. Ich glaube, Sie wollen, sie ersetzen mit:

CONCAT(`ContactSalutation`, ' ', `ContactFirstName`, ' ', `ContactLastName`), 

Zweitens diese Abfrage auf der Formatierung von Telefonnummern in hohem Maße abhängig ist. Das ist wahrscheinlich keine gute Idee, es sei denn, Sie können garantieren, dass die Formatierung konsistent ist.

Zum Beispiel ist "00 31 20 787 9000" dieselbe Telefonnummer wie "00 31 207 87 9000"?

In solchen Fällen erstelle ich normalerweise eine zusätzliche Spalte unter (z. B. "businessID") und schreibe Abfragen, um diese zu füllen.

Zum Beispiel:

update table9 t9 
inner join businesses b 
    on b.phone = t9.phone 
set businessID = b.businessID 

Sense der Tabelle überprüfen; Sie können Sie dann

update table9 t9 
inner join businesses b 
    on b.phone = trim(t9.phone) 
set businessID = b.businessID 

Schließlich tun müssen, finden, können Sie die Datensätze aus Tab.9 in Unternehmen einsetzen, der einen Null BusinessID haben, und die anderen aktualisieren.

+0

Ich habe eine reinigende Abfrage, die ich verwenden, um sicherzustellen, dass alle Telefonnummern das gleiche Format sind, ich weiß, es ist nicht perfekt, aber sie sind alle im selben Format, so dass ich in der Lage bin, das zu verwenden.Danke, dass du auf concat die Auswahl getroffen hast, das habe ich verpasst. –

1

Wenn "wenn es existiert" bedeutet, es hat den gleichen Primärschlüssel, dann ja, sollten Sie REPLACE anstelle von INSERT verwenden. Siehe http://dev.mysql.com/doc/refman/5.5/en/replace.html

Allerdings werden Sie wahrscheinlich eine Kopie Ihrer Zieltabelle zuerst erstellen sollte; o)

1

REPLACE funktioniert, aber ..

Werke REPLACE genau wie INSERT, mit der Ausnahme, dass, wenn eine alte Zeile in der Tabelle hat den gleichen Wert wie eine neue Zeile für einen PRIMARY KEY oder einen UNIQUE Index, die alte Zeile wird gelöscht, bevor die neue Zeile eingefügt wird.

Aber das bedeutet, dass die Datenbank viel mehr Zeit und Mühe in die Aktualisierung der Indizes investiert. Besser wäre INSERT zu verwenden IGNORE oder INSERT .. ON DUPLICATE KEY

Verwandte Themen