Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

INSERT INTO funktioniert nicht...

Dieses Thema im Forum "Andere Datenbankserver" wurde erstellt von frechemauz, 8 August 2013.

  1. frechemauz

    frechemauz Benutzer

    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..
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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
    
     
  3. frechemauz

    frechemauz Benutzer

    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?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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 ;-)
     
  5. frechemauz

    frechemauz Benutzer

    oh supi danke dir =) ich glaub wenn man einmal weiß wie es geht vergisst man das so schnell nicht merh :D
     
  6. ukulele

    ukulele Datenbank-Guru

    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.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Sie nutzt Oraggle. Und sie fragte nicht nur hier.
     
  8. frechemauz

    frechemauz Benutzer

    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..
     
  9. akretschmer

    akretschmer Datenbank-Guru

    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 ...
     
  10. frechemauz

    frechemauz Benutzer

    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...
     
  11. akretschmer

    akretschmer Datenbank-Guru


    Code:
    test=*# select '+' || regexp_replace('515.123.4567','\.','','g');
      ?column?
    -------------
     +5151234567
    (1 row)
    
     
  12. frechemauz

    frechemauz Benutzer

    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?
     
  13. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
    frechemauz gefällt das.
  14. frechemauz

    frechemauz Benutzer

    danke dir. =)
     
  15. akretschmer

    akretschmer Datenbank-Guru

    Kannst ja auch mal 'Gefällt mir' klicken ;-)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden