Oracle
 sql >> Datenbank >  >> RDS >> Oracle

MySQL-Äquivalent zu SEQUENCE.NEXTVAL von Oracle

http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html

3.6.9. Verwenden von AUTO_INCREMENT

Das Attribut AUTO_INCREMENT kann verwendet werden, um eine eindeutige Identität für neue Zeilen zu generieren:

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;
Which returns:

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

Für die Spalte AUTO_INCREMENT wurde kein Wert angegeben, sodass MySQL automatisch Sequenznummern zugewiesen hat. Sie können der Spalte auch explizit NULL oder 0 zuweisen, um Sequenznummern zu generieren.

Sie können den neuesten AUTO_INCREMENT-Wert mit der SQL-Funktion LAST_INSERT_ID() oder der C-API-Funktion mysql_insert_id() abrufen. Diese Funktionen sind verbindungsspezifisch, sodass ihre Rückgabewerte nicht von einer anderen Verbindung beeinflusst werden, die ebenfalls Einfügungen ausführt.

Verwenden Sie den kleinsten ganzzahligen Datentyp für die Spalte AUTO_INCREMENT, der groß genug ist, um den maximalen Sequenzwert aufzunehmen, den Sie benötigen. Wenn die Spalte die Obergrenze des Datentyps erreicht, schlägt der nächste Versuch, eine Sequenznummer zu generieren, fehl. Verwenden Sie nach Möglichkeit das Attribut UNSIGNED, um einen größeren Bereich zu ermöglichen. Wenn Sie beispielsweise TINYINT verwenden, ist die maximal zulässige Sequenznummer 127. Für TINYINT UNSIGNED ist das Maximum 255. Siehe Abschnitt 11.2.1, „Integer-Typen (exakter Wert) – INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” für die Bereiche aller Integer-Typen.

AnmerkungBei einer mehrzeiligen Einfügung geben LAST_INSERT_ID() und mysql_insert_id() tatsächlich den Schlüssel AUTO_INCREMENT aus der ersten der eingefügten Zeilen zurück. Dadurch können mehrzeilige Einfügungen auf anderen Servern in einer Replikationskonfiguration korrekt reproduziert werden.

Wenn die AUTO_INCREMENT-Spalte Teil mehrerer Indizes ist, generiert MySQL Sequenzwerte unter Verwendung des Indexes, der mit der AUTO_INCREMENT-Spalte beginnt, sofern vorhanden. Wenn beispielsweise die Tabelle animals die Indizes PRIMARY KEY (grp, id) und INDEX (id) enthält, würde MySQL den PRIMARY KEY zum Generieren von Sequenzwerten ignorieren. Als Ergebnis würde die Tabelle eine einzelne Sequenz enthalten, nicht eine Sequenz pro Grp-Wert.

Um mit einem anderen AUTO_INCREMENT-Wert als 1 zu beginnen, setzen Sie diesen Wert mit CREATE TABLE oder ALTER TABLE wie folgt:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;InnoDB-Hinweise

Seien Sie bei InnoDB-Tabellen vorsichtig, wenn Sie die Spalte mit dem Auto-Increment-Wert mitten in einer Folge von INSERT-Anweisungen ändern. Wenn Sie beispielsweise eine UPDATE-Anweisung verwenden, um einen neuen, größeren Wert in die Spalte „Auto-Increment“ einzufügen, könnte bei einem nachfolgenden INSERT der Fehler „Doppelter Eintrag“ auftreten. Der Test, ob ein Auto-Increment-Wert bereits vorhanden ist, erfolgt, wenn Sie ein DELETE gefolgt von weiteren INSERT-Anweisungen ausführen, oder wenn Sie die Transaktion COMMIT ausführen, aber nicht nach einer UPDATE-Anweisung.

MyISAM-Hinweise

Für MyISAM-Tabellen können Sie AUTO_INCREMENT in einer sekundären Spalte in einem mehrspaltigen Index angeben. In diesem Fall wird der generierte Wert für die Spalte AUTO_INCREMENT als MAX(auto_increment_column) + 1 WHERE prefix=angegebenes Präfix berechnet. Dies ist nützlich, wenn Sie Daten in geordnete Gruppen einordnen möchten.

CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

In diesem Fall (wenn die AUTO_INCREMENT-Spalte Teil eines mehrspaltigen Index ist) werden AUTO_INCREMENT-Werte wiederverwendet, wenn Sie die Zeile mit dem größten AUTO_INCREMENT-Wert in einer beliebigen Gruppe löschen. Dies passiert sogar für MyISAM-Tabellen, für die AUTO_INCREMENT-Werte normalerweise nicht wiederverwendet werden.

Weiterführende Literatur

Weitere Informationen zu AUTO_INCREMENT finden Sie hier:

So weisen Sie einer Spalte das Attribut AUTO_INCREMENT zu:Abschnitt 13.1.17, „CREATE TABLE-Syntax“, und Abschnitt 13.1.7, „ALTER TABLE-Syntax“.

Wie sich AUTO_INCREMENT in Abhängigkeit vom SQL-Modus NO_AUTO_VALUE_ON_ZERO verhält:Abschnitt 5.1.7, „Server-SQL-Modi“.

So verwenden Sie die Funktion LAST_INSERT_ID(), um die Zeile zu finden, die den neuesten AUTO_INCREMENT-Wert enthält:Abschnitt 12.14, „Informationsfunktionen“.

Festlegen des zu verwendenden AUTO_INCREMENT-Werts:Abschnitt 5.1.4, „Server-Systemvariablen“.

AUTO_INCREMENT und Replikation:Abschnitt 16.4.1.1, „Replikation und AUTO_INCREMENT“.

Server-Systemvariablen im Zusammenhang mit AUTO_INCREMENT (auto_increment_increment und auto_increment_offset), die für die Replikation verwendet werden können:Abschnitt 5.1.4, „Server-Systemvariablen“.

http://search.oracle.com/search/search?q=auto_increment&group=Documentation&x=0&y=0