Füllen Sie Felder in vorhandenen Datensätzen in postgresql mit der Datensatz-ID, um zu bestimmen, was wohin geht

356
Sirach Matthews

Das Szenario

Ich habe eine Postgresql-Datenbank mit einer Liste von Produktvarianten, die automatisch, jedoch ohne die Teilenummern, ausgefüllt wurde. Ich habe die Tabelle exportiert, um Formeln auszuführen, um die Teilenummern für jede Produktvariante zu generieren. Dies gab mir eine Tabelle mit der entsprechenden Datensatz-ID und der zugehörigen Teilenummer.

Was ich versuche zu erreichen

Nun, da ich meine Tabelle mit den fehlenden Informationen habe, wie bekomme ich diese Informationen wieder in die Postgresql-Tabelle?

Beispieldaten aus der Postgresql-Tabelle [product_product]

 id create_date weight default_code product_templ_id ... 1 2016-12-15 18:57 0 000-000000-000 1 ... 2 2016-12-16 19:00 0 000-000000-000 2 ... 3 2016-12-16 20:42 0 000-000000-000 31 ... 4 2016-12-16 20:43 0 000-000000-000 31 ... 5 2016-12-16 20:44 0 000-000000-000 31 ... 6 2016-12-16 20:45 0 31 ... ... ................ ... .............. 31 ... 1603 2016-12-16 21:51 0 31 ... 1604 2016-12-16 21:52 0 31 ... 

Musterliste der berechneten Teilenummern

 id default_code  6 000-000000-000 ... .............. 1604 000-000000-000 

Was ich versucht habe

Nun, ich habe eine ODBC-Verbindung zur Datenbank hergestellt und die Tabelle in MS Access 2010 verlinkt. Ich habe nach dem product_templ_idFeld gefiltert und nach sortiert id, um mit dem übereinzustimmen, was ich in meiner Excel-Tabelle gefunden habe. Dann kopierte ich die Teilenummern aus der default_codeSpalte und versuchte das Einfügen am Startpunkt. Ich erhielt jedoch einen Fehler, der besagte, dass ich versuchte, zu viele Informationen einzufügen. Ich habe festgestellt, dass Access versucht hat, den Inhalt der Zwischenablage in die einzelne Zelle einzufügen. Nicht das Verhalten, auf das ich gehofft hatte.

Was ist der bessere Weg?

Dieses Produkt verfügt über 1440 Varianten mit jeweils eigener Teilenummer und Stückliste. Ich möchte meine Zeit wirklich nicht damit verbringen, diese Zeile für Zeile zu generieren. Ich sage den Leuten immer, dass Daten Daten sind und Sie können alles mit Daten machen. Es geht nur darum herauszufinden, wie.

--BEARBEITEN--

Ich kann meine Tabelle aus pgAdmin exportieren, aber aus irgendeinem Grund passiert beim Importieren nichts.

Als Ergebnis habe ich den folgenden Befehl ausprobiert:

COPY product_product (default_code) from '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '/n'; 

Was dazu geführt hat:

ERROR: extra data after last expected column CONTEXT: COPY product_product, line 2: "203;000-000000-000" 

Ich stelle fest, ok, ich erwähne ein Feld, aber meine CSV hat zwei Felder. Dies liegt daran, dass ich sicherstellen möchte, dass das importierte default_codeFeld dem richtigen Datensatz zugeordnet ist.

Als nächstes habe ich versucht:

COPY product_product FROM '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '\n'; 

Ergebend:

ERROR: duplicate key value violates unique constraint "product_product_pkey" DETAIL: Key (id)=(2) already exists. 

Ich denke also, ich könnte den Tisch genauso gut fallen lassen und ihn neu aufbauen. Leider sind bei dieser Tabelle Abhängigkeiten eingerichtet, die nicht gelöscht werden können.

Wenn ich wusste, wie man einen Datensatzwert in postgresql bearbeitet, könnte ich ein Skript schreiben, um die erforderlichen Befehle zu generieren, um alle 1440-Datensätze entsprechend zu bearbeiten.

1

1 Antwort auf die Frage

1
FrankerZ

Sie sollten Ihre Daten im CSV-Format exportieren und entweder pgAdmin oder einen rohen COPY-Befehl in Postgres verwenden, um Ihre Daten wieder zu importieren:

Informationen hierzu finden Sie in diesem Beitrag: https://stackoverflow.com/questions/19400173/how-should-i-import-data-from-csv-into-a-postgres-table-using-pgadmin-3

--BEARBEITEN--

Im Anschluss an diesen Beitrag können Sie Ihre Skriptfähigkeiten verwenden, um die folgende SQL-Abfrage zu generieren:

UPDATE product_product SET default_code = CASE id WHEN 6 THEN 000-000000-000 ... ... WHEN 1603 THEN 000-000000-000 WHEN 1604 THEN 000-000000-000 ELSE default_code END; 

Stellen Sie dann mit pgAdmin eine Verbindung zu Ihrer Datenbank her und führen Sie die Abfrage aus. Dadurch werden die Datensätze in der product_productTabelle analysiert und das default_codedem relativen idWert entsprechende Feld des Datensatzes aktualisiert . Wenn der idWert nicht in Ihrer Liste enthalten ist, wird der default_codeWert einfach beibehalten .

Dieser Beitrag beendet die Abfrage mit einer zusätzlichen Anweisung:

 ... END WHERE id IN(6,...,...,1603,1604); 

In diesem speziellen Fall ist es nicht erforderlich, die spezifischen idWerte aufzulisten. Außerdem führt eine INListe von über 1440 Werten zu einem Fehler. Das ist in Ordnung, weil die ELSE default_codeAnweisung als Catchall fungiert und idWerte behandelt, die nicht in unserer caseListe enthalten sind.

Diese Lösung wurde vom OP getestet und verifiziert.

Ich konnte aus pgAdmin exportieren, aber nicht importieren. Ich habe meine Frage bearbeitet, in der ich die weiteren Schritte skizziert habe. Vielen Dank, dass Sie diesen Link geteilt haben. Es war hilfreich Sirach Matthews vor 7 Jahren 0
@SirachMatthews Im Anschluss an [diesen Beitrag] (https://www.postgresql.org/message-id/20050627145211.GA16186%40webserv.wug-glas.de) wird empfohlen, in eine neue Tabelle zu importieren und vorhandene Einträge durch SQL zu ersetzen in der Zieltabelle. Siehe auch [dieser Beitrag] (http://stackoverflow.com/questions/13947327/to-ignore-duplicate-keys-during-copy-from-in-postgresql) FrankerZ vor 7 Jahren 1