de.comp.lang.php.* FAQ

17.11. Wozu ist auto_increment nützlich? Wie erfahre ich den Wert des letzten Inkrements?

Keywords: SQL | Datenbank | MySQL | ID | auto_increment | Nummer

Antwort von Daniel T. Gorski

Ganzzahlige Datenbankfelder in MySQL können mit dem Attribut auto_increment versehen werden. Wird über die betreffende Tabelle eine INSERT-Query ausgeführt, so wird automatisch der Wert des mit auto_increment gekennzeichneten Feldes um Eins erhöht (inkrementiert), ohne dass dieses in der INSERT-Query explizit angegeben werden muss bzw. darf. Dies ist bei "flachen" Tabellen ohne Relationen nützlich z.B. bei Gästebüchern.

Mit dem MySQL-Monitor erzeugtes Beispiel:

mysql> CREATE DATABASE foo;
mysql> USE foo;

mysql> CREATE TABLE bar (
    ->    ID int(10) unsigned NOT NULL auto_increment,
    ->    INHALT varchar(32) NOT NULL,
    ->    PRIMARY KEY (ID)
    -> );

mysql> DESCRIBE bar;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| ID     | int(10) unsigned |      | PRI | 0       | auto_increment |
| INHALT | varchar(32)      |      |     |         |                |
+--------+------------------+------+-----+---------+----------------+

mysql> INSERT bar SET INHALT='erster Datensatz';
mysql> INSERT bar SET INHALT='zweiter Datensatz';

mysql> SELECT * FROM bar;
+----+-------------------+
| ID | INHALT            |
+----+-------------------+
|  1 | erster Datensatz  |
|  2 | zweiter Datensatz |
+----+-------------------+
2 rows in set (0.00 sec)

Wie man sehen kann, wird das Feld "ID" automatisch erhöht. Logischerweise darf nur ein Feld mit dem auto_increment Attribut versehen werden. Zusätzlich muss dieses Feld als Index definiert werden - z.B. als Primär-Schlüssel (PRIMARY KEY).

Um den Wert des letzten Inkrements erfahren, stellt PHP die Funktion mysql_insert_id() zur Verfügung:

<?php
// Es wird davon ausgegangen, dass $host, $user und
// $passwort korrekt initialisiert sind

// Verbindung zu MySQL-Datenbank herstellen oder sterben.
$linkID = mysql_connect($host,$user,$password)
   or die("Abbruch: Verbindung zu Host '$host' konnte"
         ." nicht hergestellt werden.");

// Benötigte Datenbank auswählen oder sterben.
@mysql_select_db("foo")
   or die("Abbruch: Datenbank '$database' konnte nicht"
         ." selektiert werden.<br><br>MySQL sagt: ".mysql_error());

// INSERT ausführen
@mysql_query("INSERT bar SET INHALT='dritter Datensatz'");

//  In unserem Beispiel ergibt das beim erstmaligen Aufruf "3"
//  dann "4", dann "5" etc.
echo mysql_insert_id($linkID);
?>

Die Funktion mysql_insert_id() liefert nichts zurück, wenn vorher keine INSERT-Query ausgeführt wurde; sie liefert einen falschen Wert, wenn der Typ des auto-increment-Feldes als BIGINT definiert wird, für die meisten Anwendungen sollte aber der Typ INT UNSIGNED mehr als ausreichend sein.

Valid HTML 4.01! Valid CSS!

17.11. Wozu ist auto_increment nützlich? Wie erfahre ich den Wert des letzten Inkrements?
http://www.php-faq.de/q/q-mysql-auto-increment.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team