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.






