Multi-Insert bei Autoinkrement des PrimaryKey in einer Tabellen

exzel

SQL-Guru
Beiträge
170
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?
 
Werbung:

PLSQL_SQL

SQL-Guru
Beiträge
176
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
 

ukulele

Datenbank-Guru
Beiträge
4.697
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 ).
 

ukulele

Datenbank-Guru
Beiträge
4.697
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.
 

akretschmer

Datenbank-Guru
Beiträge
9.614
Hallo,

danke für die Antwort. Wieder was gelernt!
Gruß
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
 

akretschmer

Datenbank-Guru
Beiträge
9.614
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.

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...
 
Werbung:

exzel

SQL-Guru
Beiträge
170
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!
 
Oben