Seite 1 von 1

sql_nextid() liefert 0 bei INSERT

Verfasst: 30.05.2004 13:04
von QCO
Ich möchte viele User auf einmal anlegen (user, groups und usergroups).
Dazu hab ich folgenden Code...

Das Problem: $last_group_id am Ende hat den Wert 0. Aber warum? Eigentlich sollte es die Gruppen-ID der zuletzt angelegten Gruppe sein (wegen autoincrement).

Code: Alles auswählen

		$group_sql = '';

        for($i = 0; $i < $nr_users; $i++)
        {
            $group_sql .= ( ( empty($group_sql) ) ? '' : ', ' ) . "('', 'Personal User', 1, 0)";
        }

        $sql = "INSERT INTO " . GROUPS_TABLE. " (group_name, group_description, group_single_user, group_moderator) VALUES $group_sql";
        if ( !$db->sql_query($sql) )
        {
            message_die(GENERAL_ERROR, "Could not insert groups", "", __LINE__, __FILE__, $sql);        
        }

		$last_group_id = $db->sql_nextid();
Der INSERT funktioniert (die Gruppen sind danach da).

Verfasst: 30.05.2004 23:16
von QCO
*wirklichnichtnervenwill*, aber ich brauche dazu mal relativ schnell eine Meiung/ Lösung/ Idee/ Alternative, weil ich sonst nicht weiterarbeiten kann...

Verfasst: 30.05.2004 23:48
von PhilippK
Könnte es evtl. schlichtweg daran liegen, dass du mehrere Datensätze auf einmal hinzufügst? Das könnte evtl. zu ungewollten Ergebnissen führen:
MySQL Manual hat geschrieben:In the case of a multiple-row INSERT statement, mysql_insert_id() returns the first automatically generated AUTO_INCREMENT value; if no such value is generated, it returns the last last explicit value inserted into the AUTO_INCREMENT column.
Versuch's doch mal testweise mit nur einem Datensatz.

Gruß, Philipp

Verfasst: 31.05.2004 01:16
von QCO
Also mit einer einzelnen Zeile funktioniert es...
Dort steht doch aber "returns the first automatically generated AUTO_INCREMENT value". Ich bin nun nicht der Übergott in Englisch, aber das bedeutet doch, dass er mir nicht den Wert für die letzte Zeile, sondern für die erste Zeile liefern sollte, oder?

Na jedenfalls hab ich das Script jetzt erstmal geändert, so dass jede Zeile einzeln ausgeführt wird, aber aus Performance-Sicht ist das keine sehr schöne Lösung...

Verfasst: 31.05.2004 10:18
von PhilippK
Es gibt bei MySQL afaik zwei Möglichkeiten, die letzte ID zu erhalten. Da müsste man jetzt genau untersuchen, welche sich wann wie verhält usw.
Ich würde es einzelnd machen - dann bist du dir über das Verhalten sicher.

Gruß, Philipp

Verfasst: 31.05.2004 13:19
von Pyramide
Alternativ könntest du ja alle Datensätze bis auf einen zusammen einfügen und dann den letzten einzeln.