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

Multi-Insert bei Autoinkrement des PrimaryKey in einer Tabellen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von exzel, 16 August 2012.

  1. exzel

    exzel Datenbank-Guru

    Hallo zusammen,

    angenommen man hat zwei zusammenhängende Tabellen mit Vertragsdaten. In der ersten Tabelle werden die Hauptdaten in der zweiten die Zusatzdaten erfasst. Bei der ersten wird der Primärschlüssel automatisch vergeben und dieser dann in der zweiten als Fremdschlüssel kopiert. Bisher hatte ich das über PHP-Programmierung lösen müssen, aber gibt es denn auch eine Möglichkeit dieses Vorgehen rein über MySQL zu lösen?
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

    nö das ist programmtechnisch zu lösen, da du hier mehrere Zusatzdateneinträge pro Hauptdatenzeile haben kannst oder?

    Wenn nicht, hätten ALLE Daten in die gleiche Tabelle geschrieben werden können!!!!


    Lg
     
  3. exzel

    exzel Datenbank-Guru

    Hi,

    vielen Dank für die Antwort. Ich weiß aber nicht wie du das meinst mit den Zusatzeinträgen pro Hauptzeile?

    Gruß
     
  4. ukulele

    ukulele Datenbank-Guru

    Gemeint ist das zu einem Eintrag in der Haupttabelle für Vertragsdaten mehrere Einträge in der Nebentabelle stehen können die mit Fremdschlüssel auf die Haupttabelle verweisen. Sinn macht es ggf. auch noch, wenn in der Nebentabelle auch gar keine Daten stehen müssen. Ansonsten hast du dir einfach nur mehr Arbeit gemacht wenn du zwei Tabellen (1,1) zu (1,1) verknüpft hast ( http://de.wikipedia.org/wiki/Min-Max-Notation ).
     
    PLSQL_SQL gefällt das.
  5. exzel

    exzel Datenbank-Guru

    Hallo,

    sowohl als auch. Es können sowohl mehrere als auch nur ein Fremschlüssel angelegt sein.
     
  6. ukulele

    ukulele Datenbank-Guru

    Dann hast du es richtig aufgebaut. Deine Datenbank muss aber vom Programm erfahren zu welchem Hauptdatensatz dein Eintrag in die Nebentabelle gehört, das kann die DB nicht selbst ermitteln. In diesem Fall kann es sinnvoll sein den Schlüssel nicht durch SQL sondern durch PHP zu erstellen um ihn dann weiter verwenden zu können, muss man aber nicht.
     
  7. exzel

    exzel Datenbank-Guru

    Hallo,

    danke für die Antwort. Wieder was gelernt!
    Gruß
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Just for info: das geht auch alles in EINEM SQL:

    Code:
    test=# create table master (id serial primary key, name text);
    NOTICE:  CREATE TABLE will create implicit sequence "master_id_seq" for serial column "master.id"
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
    CREATE TABLE
    Time: 26,079 ms
    test=*# create table slave(master_id int references master, val int);
    CREATE TABLE
    Time: 12,180 ms
    test=*# with x as (insert into master values (default, 'akretschmer') returning id) insert into slave select x.id, 27 from x;
    INSERT 0 1
    Time: 0,784 ms
    test=*# select * from master;
     id |    name
    ----+-------------
      1 | akretschmer
    (1 row)
    
    Time: 0,209 ms
    test=*# select * from slave;
     master_id | val
    -----------+-----
             1 |  27
    (1 row)
    
    Das eigentlich Insert ist in der Zeile, die mit 'with' beginnt. Werte sind lediglich das 'akretschmer' für Tabelle master und 27 für Tabelle slave. Der Rest der Magie nennt sich unter PostgreSQL 'writeable common table expression', möglicherweise geht das so auch in Oracle, bin ich mir nicht sicher. Insgesamt sehr mächtig, z.B. auch, um Daten aus einer Tabelle zu löschen und in eine andere einzufügen. Mit EINEM EINZIGEN SQL.


    Andreas
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Das ist nicht ganz korrekt, es gibt eine last_insert_id() oder so ähnlich, mit der kann man die letzte auto_increment der aktuellen Session abfragen. Ist genau das, was der Fragesteller sucht. Vermutlich jetzt zu spät...
     
    ukulele gefällt das.
  10. exzel

    exzel Datenbank-Guru

    Hallo und danke für die Antwort!

    Eine Möglichkeit der Umsetzung ist die folgende.

    $mysqli->query("INSERT INTO `1` (`ID`, `A`, `B`, `C`, `D`) VALUES ('', '2', 'b', 'c', 'd');");
    $mysqli->query("INSERT INTO `2` (`ID`, `FS_ID`, `FS_A`, `FS_B`, `FS_C`, `FS_D`)
    VALUES ('', $mysqli->insert_id, 'NACHNAME', 'NACHNAME', 'NACHNAME', 'NACHNAME');");

    Danke!
     
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