INSERT INTO funktioniert nicht...

frechemauz

Benutzer
Beiträge
8
Hallo..
ich bin ein totaler Anfänger, und habe ein kleines Problem.

Ich möchte gerne mit INSERT INTO 300 Datensätze (keine bestimmten) von der einen Tabelle in die andere kopieren.

Aktuell sieht mein Text so aus:
INSERT INTO locations (location_id, street_address, postal_code, city)
SELECT ???, adr_strasse, adr_plz, adr_ort
FROM stammdaten.filiale_select;

wie schon vermuten lässt, bei den Fragezeichen weiß ich nicht weiter. Lass ich im insert to location_id weg, meckert er rum weils n primary key ist.

ich habe allerdings nichts was ich dazu rein schreiben könnte was passen würde, und was auch ein VARCHAR ist.

vielleicht denke ich zu kompliziert, wie gesagt ich bin ein totaler anfänger, habe mich das erste mal vor einer woche mit dem Thema auseinander gesetzt und hoffe ihr könnt mir helfen. Hänge jetzt schon mehrere Stunden an dem Problem und weiß langsam keinen Rat mehr..
 
Werbung:
Hallo..
ich bin ein totaler Anfänger, und habe ein kleines Problem.

Ich möchte gerne mit INSERT INTO 300 Datensätze (keine bestimmten) von der einen Tabelle in die andere kopieren.

Aktuell sieht mein Text so aus:
INSERT INTO locations (location_id, street_address, postal_code, city)
SELECT ???, adr_strasse, adr_plz, adr_ort
FROM stammdaten.filiale_select;

wie schon vermuten lässt, bei den Fragezeichen weiß ich nicht weiter. Lass ich im insert to location_id weg, meckert er rum weils n primary key ist.

ich habe allerdings nichts was ich dazu rein schreiben könnte was passen würde, und was auch ein VARCHAR ist.

vielleicht denke ich zu kompliziert, wie gesagt ich bin ein totaler anfänger, habe mich das erste mal vor einer woche mit dem Thema auseinander gesetzt und hoffe ihr könnt mir helfen. Hänge jetzt schon mehrere Stunden an dem Problem und weiß langsam keinen Rat mehr..


Ohne Deine Tabellen zu kennen und als Fehlermeldung nur 'meckert er rum' zu wissen kann man Dir kaum helfen. Prinzipiell machst Du aber nix falsch:

Code:
test=# create table frechemauz_source (id serial primary key, col1 text, col2 text, col3 text);
NOTICE:  CREATE TABLE will create implicit sequence "frechemauz_source_id_seq" for serial column "frechemauz_source.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "frechemauz_source_pkey" for table "frechemauz_source"
CREATE TABLE
test=*# insert into frechemauz_source (col1, col2, col3) select random()::text, random()::text, random()::text from generate_series(1,5) s;
INSERT 0 5
test=*# create table frechemauz_destination (id serial primary key, col1 text, col2 text, col3 text);
NOTICE:  CREATE TABLE will create implicit sequence "frechemauz_destination_id_seq" for serial column "frechemauz_destination.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "frechemauz_destination_pkey" for table "frechemauz_destination"
CREATE TABLE
test=*# insert into frechemauz_destination (col1, col2, col3) select col1, col2, col3 from frechemauz_source;
INSERT 0 5
 
Naja die fehlermeldung ist "Cannot insert NULL into ("HR."LOCATIONS"."LOCATION_ID")"
location_id ist der primärschlüssel.

aber ich habe keinen primärschlüssel in der anderen Tabelle der dazu passt...
kann man das irgendwie "umgehen" oder anders machen ohne primärschlüssel?
 
Naja die fehlermeldung ist "Cannot insert NULL into ("HR."LOCATIONS"."LOCATION_ID")"
location_id ist der primärschlüssel.

aber ich habe keinen primärschlüssel in der anderen Tabelle der dazu passt...
kann man das irgendwie "umgehen" oder anders machen ohne primärschlüssel?

Dann must halt einen erzeugen. Dazu kann man z.B. eine Sequence nehmen:

Code:
test=*# create table ziel_mit_pk (id int primary key, col text);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "ziel_mit_pk_pkey" for table "ziel_mit_pk"
CREATE TABLE
test=*# insert into ziel_mit_pk (col) select col1 from frechemauz_destination;
ERROR:  null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, 0.339744392316788).
test=*# create sequence my_new_sequence;
CREATE SEQUENCE
test=*# insert into ziel_mit_pk select nextval('my_new_sequence'), col1 from frechemauz_destination;
INSERT 0 5
test=*# select * from ziel_mit_pk;
 id |        col
----+-------------------
  1 | 0.339744392316788
  2 | 0.351055754814297
  3 | 0.938213612418622
  4 | 0.529229832347482
  5 | 0.802613661624491
(5 rows)

Am Anfang habe ich den bei Dir kommenden Fehler provoziert, dann habe ich es einfach nur richtig gemacht ;-)
 
Du postest in "Andere Datenbankserver" also wäre es schön und eventuell notwendig zu wissen um welche DB es geht. Dein Problem ist erstmal recht leicht. Du importiertst eine größere Anzahl an Datensätzen und musst zu jedem Datensatz einen PK angeben der eindeutig sein muss! Das ist ja der Sinn eines PKs. Das heißt er darf noch nicht in der Tabelle vorhanden sein und du kannst nicht einfach einen fixen Wert für alle Datensätze verwenden.

Also bist du darauf angewiesen dies mit einer Funktion zu lösen die bei jedem Aufruf einen neuen, passenden Wert zurück gibt. Wege gibt es da einige, siehe Oben :) Am einfachsten ist es meist mit DB eigenen Funktionen zu arbeiten. Da du allerdings als PK einen VARCHAR hast (falls das stimmt) musst du erstmal wissen wie der aufgebaut ist und kannst nicht einfach irgendwas da rein frickeln.
 
Du postest in "Andere Datenbankserver" also wäre es schön und eventuell notwendig zu wissen um welche DB es geht. Dein Problem ist erstmal recht leicht. Du importiertst eine größere Anzahl an Datensätzen und musst zu jedem Datensatz einen PK angeben der eindeutig sein muss! Das ist ja der Sinn eines PKs. Das heißt er darf noch nicht in der Tabelle vorhanden sein und du kannst nicht einfach einen fixen Wert für alle Datensätze verwenden.

Also bist du darauf angewiesen dies mit einer Funktion zu lösen die bei jedem Aufruf einen neuen, passenden Wert zurück gibt. Wege gibt es da einige, siehe Oben :) Am einfachsten ist es meist mit DB eigenen Funktionen zu arbeiten. Da du allerdings als PK einen VARCHAR hast (falls das stimmt) musst du erstmal wissen wie der aufgebaut ist und kannst nicht einfach irgendwas da rein frickeln.

Sie nutzt Oraggle. Und sie fragte nicht nur hier.
 
Ist das denn schlimm, wenn ich nicht nur in einem Forum frage?!
Falls ja, ich hab mir dabei nichts schlimmes gedacht, sondern eher gehofft dass ich in einem von beiden eine Antwort bekomme..
 
Ist das denn schlimm, wenn ich nicht nur in einem Forum frage?!
Falls ja, ich hab mir dabei nichts schlimmes gedacht, sondern eher gehofft dass ich in einem von beiden eine Antwort bekomme..

Es wird im allgemeinen nicht gern gesehen, insbesondere dann nicht, wenn man nicht darauf hinweist. Das kommt noch von ganz alten Zeiten, als 'Foren' noch 'Newsgroups' genannt wurden und man statt 'http' als Protokoll 'nntp' nutzte und zwar nicht im 'Internet', sondern im 'Usenet'. Aber damit wirst Du jetzt sicher nix anfangen können ...
 
okay... dann tut es mir leid und das wusste ich nicht..
Aber nein, ich kann damit nichts anfangen ^^ Das einzige was ich daraus schließen kann ist, dass es lange her ist ^^

Darf ich trotzdem noch eine Frage stellen?
Und zwar möchte ich mein Telefonformat umstellen. Aktuell sieht das so aus
bsp: 515.123.4567

Ich möchte es auf die deutsche Schreibweise umstellen also
bsp: +495151234567

wie kann ich das realisieren?
ich frag auch nicht nochmal in einem anderen forum nach...
 
Und zwar möchte ich mein Telefonformat umstellen. Aktuell sieht das so aus
bsp: 515.123.4567

Ich möchte es auf die deutsche Schreibweise umstellen also
bsp: +495151234567

wie kann ich das realisieren?
ich frag auch nicht nochmal in einem anderen forum nach...


Code:
test=*# select '+' || regexp_replace('515.123.4567','\.','','g');
  ?column?
-------------
 +5151234567
(1 row)
 
Das ist ja jetzt für das bestimmte Beispiel.
und wie krieg ich das hin, dass es genau das für alle Datensätze macht?

Code:
test=*# create table frechemauz (tel text);
CREATE TABLE
test=*# insert into frechemauz values ('515.123.4567');
INSERT 0 1
test=*# select '+' || regexp_replace(tel,'\.','','g') from frechemauz ;
  ?column?
-------------
 +5151234567
(1 row)
 
Werbung:
Zurück
Oben