pg-datenbanktablle füllen - noch mal

Hallo Andreas,
du hattes mir ja, im Beitrag vom 25.02. schon ein paar Hinweise gegeben:
wie:

Fall1:
Du brauchst eine Verbindung zwischen dieser Tabelle und den vorliegenden > Daten. Ein PK drängt sich da förmlich auf. Der Rest ist simples SQL.

Was ist ein “PK”?

Fall2: noch einfacher als Fall1.

Zitat:
Wenn ich COPY richtig verstehen, werden ja die nicht definierten Spalten >>mit ‘default’- Werten oder NULL überschrieben.
Darin sehe ich kein Problem.

Zitat:
Mit UPDATE kann ich immer nur eine Zeile bearbeiten.
Nein. Und ich bin sehr, sehr froh, daß PG mit Transaktionen gut zurecht >kommt, weil ein WHERE bei einem UPDATE kann ohne Transaktionen echt >schmerzhaft sein. Spätestens dann merkst man, das ein UPDATE deutlich > mehr als eine Zeile bearbeiten kann…

Wenn ich dich richtig verstanden habe, muss ich hier eine Verbindung zwischen UPDATE und COPY erzeugen, die mir aus meiner Textdatei nur aus der Spalte “Bemerkung” den richtigen Text der zugehörigen “adrid” holt und im Datenbankfeld “customertxt” meiner Datenbanktablle “customer” ablegt.

als etwa so:

  1. Hilfstabelle erzeugen adrid, name1, name 2, ort, bemerkung aus .csv-Datei

  2. UPDATE custamer- Tabelle SET ???
    hier fehlt mit der Faden.

Wie muss ich diese UPDATE-Anweisung aufbauen?
Gruß
Armin

Primary Key
Referenzielle Integrität - Wikipedia

Fall2: noch einfacher als Fall1.


Wenn ich dich richtig verstanden habe, muss ich hier eine Verbindung zwischen UPDATE und COPY erzeugen, die mir aus meiner Textdatei nur aus der Spalte “Bemerkung” den richtigen Text der zugehörigen “adrid” holt und im Datenbankfeld “customertxt” meiner Datenbanktablle “customer” ablegt.

als etwa so:

  1. Hilfstabelle erzeugen adrid, name1, name 2, ort, bemerkung aus .csv-Datei

  2. UPDATE custamer- Tabelle SET ???
    hier fehlt mit der Faden.

Wie muss ich diese UPDATE-Anweisung aufbauen?
Gruß
Armin

Mir fehlt grad der Faden. Vielleicht hilft aber schon das weiter:

test=# create table ziel (id int primary key, t text);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "ziel_pkey" for table "ziel"
CREATE TABLE
Time: 78.549 ms
test=*# create table quelle (id int, t text);
CREATE TABLE
Time: 39.831 ms
test=*# insert into ziel (id) select generate_series(1,10);
INSERT 0 10
Time: 3.017 ms
test=*# insert into quelle (id, t) select s, 'text'||s from generate_series(1,10) s;
INSERT 0 10
Time: 2.701 ms
test=*# update ziel set t = quelle.t from quelle where ziel.id=quelle.id;
UPDATE 10
Time: 3.473 ms
test=*# select * from ziel;
 id |   t
----+--------
  1 | text1
  2 | text2
  3 | text3
  4 | text4
  5 | text5
  6 | text6
  7 | text7
  8 | text8
  9 | text9
 10 | text10
(10 rows)

Andreas

Hallo Andreas,

Danke fuer deinen Hinweis.
Ich habe den Code nachvollzogen und probiert / klappt, super.

>test=# create table ziel (id int primary key, t text);
>NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "ziel_pkey" >for table "ziel"
>CREATE TABLE
>Time: 78.549 ms
>test=*# create table quelle (id int, t text);
>CREATE TABLE
>Time: 39.831 ms
>test=*# insert into ziel (id) select generate_series(1,10);
>INSERT 0 10
>Time: 3.017 ms
>test=*# insert into quelle (id, t) select s, 'text'||s from generate_series(1,10) s;
>ZINSERT 0 10
>Time: 2.701 ms
>test=*# update ziel set t = quelle.t from quelle where ziel.id=quelle.id;
>UPDATE 10
>Time: 3.473 ms
>test=*# select * from ziel;
> id |   t
>----+--------
>  1 | text1
>  2 | text2
>  3 | text3
>  4 | text4
>  5 | text5
>  6 | text6
>  7 | text7
>  8 | text8
>  9 | text9
> 10 | text10
>(10 rows)
>

Mein Problem liegt aber noch ein einer anderen Stelle, und zwar beim Kopieren der .csv Datei in eine nach obigem Muster (nur angepasst) angelegte Datenbanktabelle, bei mir “kunden”.
psql mag laut Hinweis den COPY-Befehl nicht (soll nur fuer den superuser funktionieren), also muss ich copy mit backslash davor nehmen.
In meinen Datensaetzen sind jedoch folgende unregelmaessigkeiten:

  1. Die Spalte Datum (Anlegedatum des Datensatzes) ist in der Datenbank als date charakterisiert, jedoch nicht in jedem Datensatz in der Text-Datei vorhanden. copy bicht an dieser Stelle ab mit dem Hinweis, dass >> << kein Datum ist.
    Wie kann man das loesen ?
  2. In meinen Textbloecken der Text-Datei befinden sich Zeilenschaltungen (weil unser Mitarbeiter hier bsw. Lieferadressen oder Privatadressen hinterlegt hatten) und "-Zeichen fuer die Angabe von Rohr-Groessen, auch brich copy ab.
    Wie kann man das loesen ?
    Vielliecht geht das mit s.g. “regulaeren Ausdruecken”, aber wie formuliert man diese, wenn die Lage der Fehlerstellen nicht eindeutig ist ?

Gruss
Armin

Du kannst bestimmen, wie Null-Felder behandelt werden. In der Hilfe zu COPY steht NULL [ AS ] ‘null string’

  1. In meinen Textbloecken der Text-Datei befinden sich Zeilenschaltungen (weil unser Mitarbeiter hier bsw. Lieferadressen oder Privatadressen hinterlegt hatten) und "-Zeichen fuer die Angabe von Rohr-Groessen, auch brich copy ab.
    Wie kann man das loesen ?

weiß ich grad nicht, das " wirst Du mit \ quoten müssen.

Andreas