lixx: Relationales INSERT

Guten Morgen!

Gibt es eine Möglichkeit bei MySQL einen Relationalen INSERT-Befehl auszuführen?

Angenommen ich habe zwei Tabellen. Adressen und Gruppen und eine Adresse kann Mehrere Gruppen beinhalten. Jetzt habe ich eine dritte MN-Tabelle die beide miteinander verknüpft.

Lege ich nun eine Adresse an die mehreren Gruppen zugeordnet ist, dann macht man das ja über INSERTs.

INSERT INTO A ( vorname, nachname ) VALUES ( 'max', 'muster' );

INSERT INTO AG ( Aid, Gid ) VALUES
( LAST_INSERT_ID(), 1 ),
( LAST_INSERT_ID(), 2 ),
( LAST_INSERT_ID(), 3 );

// Ob das so mit "LAST_INSERT_ID()" funktioniert, weiß ich nicht ...

Gibt es da keinen besseren Befehl? Ich habe schon gegoogelt, habe aber nicht mal eine Ahnung, wonach ich dabei googeln soll.

Bitte um Hilfe.

lg lixx

  1. Hallo lixx,

    Gibt es eine Möglichkeit bei MySQL einen Relationalen INSERT-Befehl auszuführen?

    leider habe ich keine Ahnung was ein "Relationaler INSERT-Befehl" sein soll. Ich habe diesen Begriff vorher noch nie gelesen.

    Lege ich nun eine Adresse an die mehreren Gruppen zugeordnet ist, dann macht man das ja über INSERTs.

      
    
    > INSERT INTO A ( vorname, nachname ) VALUES ( 'max', 'muster' );  
    >   
    > INSERT INTO AG ( Aid, Gid ) VALUES  
    > ( LAST_INSERT_ID(), 1 ),  
    > ( LAST_INSERT_ID(), 2 ),  
    > ( LAST_INSERT_ID(), 3 );  
    >   
    > // Ob das so mit "LAST_INSERT_ID()" funktioniert, weiß ich nicht ...  
    
       -- Zeilenkommentare in SQL mit zweifachem Minus-Zeichen.  
       -- das versteht jedes mir bekannte DBMS  
       /* Kommentarbereiche wie z.B. in C so wie  
          in diesen beiden Zeilen :-) */  
       -- solche Kommentare leider nicht jedes (ich glaube, DB2 versteht das nicht).  
       -- // habe ich bei SQL noch nie als Kommentar gesehen,  
       -- vielleicht versteht das ja ein DBMS  
    
    

    Gibt es da keinen besseren Befehl?

    Gegebenenfalls kann Dir die INSERT ... SELECT-Syntax weiterhelfen. MySQL 5.x vorausgesetzt könntest Du die zusammengehörenden INSERT-Statements in eine Stored Procedure packen.

    Freundliche Grüße

    Vinzenz

    1. Gibt es eine Möglichkeit bei MySQL einen Relationalen INSERT-Befehl auszuführen?

      leider habe ich keine Ahnung was ein "Relationaler INSERT-Befehl" sein soll. Ich habe diesen Begriff vorher noch nie gelesen.

      Naja, ob das so heißt weiß ich auch nicht. Wahrscheinlich nicht ;)

      Bin aber bereits weiter gekommen:

        
      INSERT INTO A ( vorname, nachname ) VALUES ( 'max', 'muster' );  
      SELECT @lid := LAST_INSERT_ID();  
      INSERT INTO AG ( Aid, Gid ) VALUES  
      ( @lid, 1 ),  
      ( @lid, 2 ),  
      ( @lid, 3 );  
      
      

      // Ob das so mit "LAST_INSERT_ID()" funktioniert, weiß ich nicht ...
         -- Zeilenkommentare in SQL mit zweifachem Minus-Zeichen.

      ... war kein Kommentar von MySQL - aber egal, danke.

      Gegebenenfalls kann Dir die INSERT ... SELECT-Syntax weiterhelfen. MySQL 5.x vorausgesetzt könntest Du die zusammengehörenden INSERT-Statements in eine Stored Procedure packen.

      Habe leider nur MySQL 4.1. Soweit ich mich bereits vorgearbeitet habe, gibt es aber nicht soetwas was ich mir vorstelle.

      lg lixx

      1. Bin aber bereits weiter gekommen:

        INSERT INTO A ( vorname, nachname ) VALUES ( 'max', 'muster' );
        SELECT @lid := LAST_INSERT_ID();
        INSERT INTO AG ( Aid, Gid ) VALUES
        ( @lid, 1 ),
        ( @lid, 2 ),
        ( @lid, 3 );

          
        Habe aber nun leider damit mit LAST\_INSERT\_ID() ein Problem. Sie gibt mir 0 zurück.  
          
        ~~~sql
          
        INSERT INTO A ( id ) VALUES ( NULL );  
        SELECT LAST_INSERT_ID( );
        

        --> 0

        Das ist die Tabelle A:

          
        CREATE TABLE `A` (  
          `id` int(11) unsigned NOT NULL auto_increment,  
          ...,  
          PRIMARY KEY  (`id`),  
          KEY `pid` (`pid`,`email`)  
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11141;
        

        Kann mir dabei bitte jemand helfen?

        lg lixx

        1. Zur Ergänzung, folgendes funktioniert auch:

            
          INSERT INTO A ( id ) VALUES ( NULL );  
          INSERT INTO A ( id ) VALUES ( LAST_INSERT_ID()+10 );
          

          --> id: 52
          --> id: 62

          Daher kann ich mir nicht erklären, woran es liegt.

          1. Ich glaube die Lösung gefunden zu haben:

            INSERT INTO A ( id ) VALUES ( NULL );  
            SELECT @id := id FROM A WHERE id = LAST_INSERT_ID();  
            SELECT @id;
            

            --> id: 82

            Ich stelle mir nur die Frage, warum SELECT LAST_INSERT_ID(); nicht funzt?

        2. Hallo

          Habe aber nun leider damit mit LAST_INSERT_ID() ein Problem. Sie gibt mir 0 zurück.

          INSERT INTO A ( id ) VALUES ( NULL );
          SELECT LAST_INSERT_ID( );

            
          Laut MySQL-Handbuch sollte dieses INSERT fehlschlagen.  
          <http://dev.mysql.com/doc/refman/4.1/en/insert.html>, schau Dir den Abschnitt zu  
            
              Inserting NULL into a column that has been declared NOT NULL  
            
          an. Praxistests haben allerdings ergeben, dass der Datensatz dennoch angelegt wird. Es ist natürlich eine fürchterlich schlechte Praxis, für diesen Wert, den Du nicht kennst den speziellen Wert NULL anzugeben.  
            
          a) Lass die Spalte einfach weg, es wird der Defaultwert genommen  
          b) MySQL 4.1 und höher vorausgesetzt: Verwende DEFAULT statt NULL.  
            
          
          > Das ist die Tabelle A:  
          >   
          > ~~~sql
            
          
          > CREATE TABLE `A` (  
          >   `id` int(11) unsigned NOT NULL auto_increment,  
          >   ...,  
          >   PRIMARY KEY  (`id`),  
          >   KEY `pid` (`pid`,`email`)  
          > ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11141;
          
          

          Freundliche Grüße

          Vinzenz

          1. echo $begrüßung;

            INSERT INTO A ( id ) VALUES ( NULL );

            Laut MySQL-Handbuch sollte dieses INSERT fehlschlagen.

            Nein, sollte es nicht.

            http://dev.mysql.com/doc/refman/4.1/en/insert.html, schau Dir den Abschnitt zu

            Inserting NULL into a column that has been declared NOT NULL

            an. Praxistests haben allerdings ergeben, dass der Datensatz dennoch angelegt wird.

            Ja, denn wegen der Deklaration als auto_increment

            CREATE TABLE A (
              id int(11) unsigned NOT NULL auto_increment,

            trifft nun das unter CREATE TABLE beschriebene Verhalten zu:

            When you insert a value of NULL (recommended) or 0 into an indexed AUTO_INCREMENT column, the column is set to the next sequence value.

            echo "$verabschiedung $name";