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

Primary key eines soeben neu erstellten Eintrages erhalten

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Min-Max-Frager, 20 April 2017.

  1. Min-Max-Frager

    Min-Max-Frager Benutzer

    Hallo,

    ist es möglich, mittels 'INSERT...' (o.ä.) einen neuen Datensatz zu erstellen und im gleichen Zug den Primary key des soeben neu erstellten Datensatzes zu erhalten?

    Erläuterung:
    Diesen Primary key möchte ich nämlich dann in einer anderen Tabelle in einem bereits vorhandenen Datensatz einfügen ('UPDATE ...').

    Ich benutze Win10 & VS14 (Expr.) & die aktuelle MariaDB .

    Vielen Dank!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Dafür gibt es eine Funktion in MySQL, die die letzten id liefert, die in dieser Session vergeben wurde. In PostgreSQL ginge das so:

    Code:
    test=# create table master (id serial primary key, name text);
    CREATE TABLE
    test=*# create table detail(master_id int references master, detail_name text);
    CREATE TABLE
    test=*# insert into master (name) values ('name1');
    INSERT 0 1
    test=*# select currval('master_id_seq');
     currval
    ---------
      1
    (1 Zeile)
    
    Du machst also den Insert, fragst dann die vergebene ID ab (via currval()) und nutzt das für den Insert in die Detailtabelle. Einfacher geht es mit diesem Trick:

    Code:
    test=*# with id as (insert into master(name) values ('name2') returning id) insert into detail (master_id, detail_name) select id.id, 'detail name 2' from id;
    INSERT 0 1
    
    Statt 3 Befehle (Insert, select currval(), Insert) ist das alles nun in einem Befehl drin. Können aber nur bessere Datenbanken wie PostgreSQL.

    Btw.:

    Das ist ein prinzipieller Fehler. Wenn der Datensatz da schon drin ist - mit welchem Foreign Key? Einem falschen? FAIL! Mit gar keinem? FAIL!
     
  3. Min-Max-Frager

    Min-Max-Frager Benutzer

    Hallo,
    (leider?) hat MariaDB die Funktion 'CURRVAL' nicht.
    Trotzdem Danke: Das hat mich auf die Spur von 'LAST_INSERT_ID' gebracht:
    MariaDB: LAST_INSERT_ID Function

    Noch kurz zu dem Fail-Hinweis: Find ich prima, das auch gleich meine Randbedingungen geprüft wurden.
    Aber: Mein Problem ist ähnlich wie mit (wertvollen) Weinflaschen (Tabelle 1) und diversen Freunden (Tabelle 2).
    Die Flaschen sind zuerst vorhanden (= vorhandener Datensatz).
    Jeder neue Freund (=neuer Datensatz mit dem Primary Key) bekommt entweder keine oder eine oder mehrere Weinflaschen.

    Vielen Dank und liebe Grüße!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Die Freunde kommen in eine Tabelle aller Freunde. In eine weitere Tabelle kommt, wer (Foreign Key auf die Freunde) welchen Wein (Foreign Key auf die Flaschen-Tabelle) und wie viele davon bekommt. Da ist keine Notwendigkeit, in dieser Tabelle Updates auf den Foreign Key - Spalten zu machen.
     
    Min-Max-Frager und BerndB gefällt das.
  5. Min-Max-Frager

    Min-Max-Frager Benutzer

    ... hhhhmmmm .... uups, das hatte ich wohl aus den Augen verloren.
    Ein spätes aber echtes 'Danke'!!

    Da muss ich wohl nochmal ran.
     
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