Datenimport

Hallo,

ich habe ein Wahrenwirtschaftssystem mit einer Postgresql - Datenbank.
Meine Artikelliste möchte ich mit einer CSV-Datei uploaden. Da klappt jetzt auch schon einigermasten. Nur wir jezt jede Woche die Artikelliste aktualisiert und ich möchte die Änderungen dann wieder mit der CSV-Datei uploaden.

Wenn ich daß aber mache, mekert Postgresql, daß der Artikel schon vorhanden ist, anstadt Ihn zu ändern. Muß man jedesmal die Tabelle erst wieder löschen, und dann die Artikel wieder uploaden? Damit hätte ich probleme, da ich auch noch andere Artiekel per Hand eingegeben habe die ich behalten möchte.


Hat da wer eine Idee?

Gruß Nixdorf

Du könntest eine temporäre Tabelle für die neuen anlegen und dann per UPDATE die reguläre Tabelle dort updaten, wo sie geändert ist. Danach löschst du die temporäre Tabelle wieder.

CU Uwe

Nun, eigentlich müsste ein Programm/Script bei dir dafür sorgen, das nur geänderte Datensätze eingespielt werden. Wie genau das auszusehen hat, kann dir wohl keiner sagen, ohne mehr über die Struktur deiner Db zu kennen und wie die Daten angeliefert werden.

Kannst Du bei Deinem tun ausschließen, daß ForeignKey - Bindungen zerstört werden?
Artikelliste klingt für mich zumindest stark danach, daß da von anderen Tabellen aus via FK referenziert wird.

Wenn ich daß aber mache, mekert Postgresql, daß der Artikel schon vorhanden ist, anstadt Ihn zu ändern. Muß man jedesmal die Tabelle erst wieder löschen, und dann die Artikel wieder uploaden? Damit hätte ich probleme, da ich auch noch andere Artiekel per Hand eingegeben habe die ich behalten möchte.

Bei einem Design mit FK-Beziehungen hättest Du da ganz andere Probleme. Gut, okay, man kann mit DEFERRED da einiges abfangen, aber sauberer wäre es hier IMHO, die neuen Daten erst mal in eine temp. Zwischentabelle zu laden und von da aus mit SQL zu schauen, welche Records nun neu und welche geändert sind und dann weiter mit normalem SQL diese Dinge zu tun.

Andreas

Hallo,

eine identische zusätzlichen Tabelle parts_temp habe ich erstellt, da werde ich dann die aktuelle Artikelliste zunächst reinpacken. Wie kann ich es dann am besten veranlassen, das alle Artikel die sich geändert haben bzw. neu sind dann in die Tabelle parts übernommen werden. Wie kann ich es veranlassen das Artikel die nicht mehr vorhanden sind gellöscht werden?


Vielen Dank für die Hilfe…

Gruß Nixdorf

Mal als Ansatz:

test=# select * from parts;
 id |         name
----+----------------------
  1 | soll bleiben
  2 | soll erneuert werden
  4 | soll gelöscht werden
(3 rows)

test=*# select * from parts_temp ;
 id |      name
----+-----------------
  2 | geänderter wert
  3 | neuer wert
(2 rows)

test=*# update parts set name=(select parts_temp.name from parts_temp where parts.id=parts_temp.id) where id in (select id from parts_temp);
UPDATE 1
test=*# select * from parts;
 id |         name
----+----------------------
  1 | soll bleiben
  4 | soll gelöscht werden
  2 | geänderter wert
(3 rows)

Andreas

Hallo,

ich habe es probiert mit:

update parts set sellprice=(select parts_temp.sellprice from parts_temp where parts.id=parts_temp.id) where id in (select id from parts_temp);

bekomme aber zur Antwort:

bash: syntax error near unexpected token `(’

Da muß irgendetwas mit der Syntax nicht stimmen.


Gruß Nixdorf

Mich verwundert zuerst einmal das

bash:

Andreas

Hallo,

ich habe eine Konsole gestartet. Dann mit su root auf root rewechselt.
Dann su postgres eingegeben und dann

update parts set sellprice=(select parts_temp.sellprice from parts_temp where parts.id=parts_temp.id) where id in (select id from parts_temp);

ausgeführt. Habe ich da noch einen Denkfehler?

Gruß Nixdorf

Ja, du führst das auf der Shell des Users postgres aus, du musst dich erst noch zur Datenbank mittels psql verbinden.

… bist Du der User ‘postgres’.

update parts set sellprice=(select parts_temp.sellprice from parts_temp where parts.id=parts_temp.id) where id in (select id from parts_temp);

ausgeführt. Habe ich da noch einen Denkfehler?

Ja. Das ist kein Shell-Befehl, sondern ein SQL-Befehl. Um einen SQL-Befehl abzusetzen benötigt man einen passenden Client. Ein Shell-Terminalfenster nimmt Shell-Befehle entgegen. Falls man dort versucht, einen SQL-Befehl einzugeben, kommt erwartungsgemäß ein Fehler.

kretschmer@tux:~$ update parts set sellprice=(select parts_temp.sellprice from parts_temp where parts.id=parts_temp.id) where id in (select id from parts_temp             );
bash: syntax error near unexpected token `('

So, falls nun noch nicht klar ist, was Du vergessen hast: starte psql.


seufz
Andreas

Hallo,

prima, das scheint zu klappen. Allerdings habe ich in meiner Tabelle noch weitere 6 Spalten, die auch upgedatet werden müsten. Wie kann ich die ebenfalls updaten lassen, ohne den Befehl mehrfach auszuführen?

Ich habe überings auch versuch, mal einige Artikel in der CSV-Liste zu löschen und dann die Liste in die parts_tmp - Tabelle hochgeladen, dann die Tabelle parts mit der parts_tep - Tabelle upgedatet, aber die Artikel, die ich gelöscht hatte waren immer noch da. Liegt das daran, das ich nur eine Spalte bearbeitet hatte und nicht alle?


Gruß Nixdorf

Wie wäre es einklich, mal a bissl in die Doku zu schauen und zu erforschen, was alles mit UPDATE geht?

test=# create table foo (id int, val1 int, val2 int, val3 int);
CREATE TABLE
test=*# insert into foo values (1,11,12,13);
INSERT 0 1
test=*# insert into foo values (2,21,22,23);
INSERT 0 1
test=*# update foo set val1=val1*2, val2=val2*3 where id = 1;
UPDATE 1
test=*# select * from foo;
 id | val1 | val2 | val3
----+------+------+------
  2 |   21 |   22 |   23
  1 |   22 |   36 |   13
(2 rows)



Ich habe überings auch versuch, mal einige Artikel in der CSV-Liste zu löschen und dann die Liste in die parts_tmp - Tabelle hochgeladen, dann die Tabelle parts mit der parts_tep - Tabelle upgedatet, aber die Artikel, die ich gelöscht hatte waren immer noch da. Liegt das daran, das ich nur eine Spalte bearbeitet hatte und nicht alle?

Deine parts_temp - table vorher leer gemacht?

Andreas

Hallo,

prima, das scheint zu klappen. Allerdings habe ich in meiner Tabelle noch weitere 6 Spalten, die auch upgedatet werden müsten. Wie kann ich die ebenfalls updaten lassen, ohne den Befehl mehrfach auszuführen?

Ich habe überings auch versuch, mal einige Artikel in der CSV-Liste zu löschen und dann die Liste in die parts_tmp - Tabelle hochgeladen, dann die Tabelle parts mit der parts_tep - Tabelle upgedatet, aber die Artikel, die ich gelöscht hatte waren immer noch da. Liegt das daran, das ich nur eine Spalte bearbeitet hatte und nicht alle?


Gruß Nixdorf

Hallo,

ja kannst du. Hier nochmals der Hinweis auf die Doku - da steht das nämlich drinnen: PostgreSQL: Documentation: Manuals: PostgreSQL 8.2: UPDATE

cu tb.

Hallo,

prima, das scheint zu klappen. Allerdings habe ich in meiner Tabelle noch weitere 6 Spalten, die auch upgedatet werden müsten. Wie kann ich die ebenfalls updaten lassen, ohne den Befehl mehrfach auszuführen?

Ich habe überings auch versuch, mal einige Artikel in der CSV-Liste zu löschen und dann die Liste in die parts_tmp - Tabelle hochgeladen, dann die Tabelle parts mit der parts_tep - Tabelle upgedatet, aber die Artikel, die ich gelöscht hatte waren immer noch da. Liegt das daran, das ich nur eine Spalte bearbeitet hatte und nicht alle?


Gruß Nixdorf

Hallo,

prima, das scheint zu klappen. Allerdings habe ich in meiner Tabelle noch weitere 6 Spalten, die auch upgedatet werden müsten. Wie kann ich die ebenfalls updaten lassen, ohne den Befehl mehrfach auszuführen?

Ich habe überings auch versuch, mal einige Artikel in der CSV-Liste zu löschen und dann die Liste in die parts_tmp - Tabelle hochgeladen, dann die Tabelle parts mit der parts_tep - Tabelle upgedatet, aber die Artikel, die ich gelöscht hatte waren immer noch da. Liegt das daran, das ich nur eine Spalte bearbeitet hatte und nicht alle?


Gruß Nixdorf