Oracle
 sql >> Base de données >  >> RDS >> Oracle

Équivalent MySQL de SEQUENCE.NEXTVAL d'Oracle

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

3.6.9. Utiliser AUTO_INCREMENT

L'attribut AUTO_INCREMENT peut être utilisé pour générer une identité unique pour les nouvelles lignes :

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 |
+----+---------+

Aucune valeur n'a été spécifiée pour la colonne AUTO_INCREMENT, donc MySQL a automatiquement attribué des numéros de séquence. Vous pouvez également affecter explicitement NULL ou 0 à la colonne pour générer des numéros de séquence.

Vous pouvez récupérer la valeur AUTO_INCREMENT la plus récente avec la fonction SQL LAST_INSERT_ID() ou la fonction API C mysql_insert_id(). Ces fonctions sont spécifiques à la connexion, de sorte que leurs valeurs de retour ne sont pas affectées par une autre connexion qui effectue également des insertions.

Utilisez le plus petit type de données entier pour la colonne AUTO_INCREMENT suffisamment grand pour contenir la valeur de séquence maximale dont vous aurez besoin. Lorsque la colonne atteint la limite supérieure du type de données, la prochaine tentative de génération d'un numéro de séquence échoue. Utilisez l'attribut UNSIGNED si possible pour autoriser une plus grande plage. Par exemple, si vous utilisez TINYINT, le numéro de séquence maximal autorisé est 127. Pour TINYINT UNSIGNED, le maximum est 255. Voir Section 11.2.1, « Types entiers (valeur exacte) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” pour les plages de tous les types d'entiers.

RemarquePour une insertion sur plusieurs lignes, LAST_INSERT_ID() et mysql_insert_id() renvoient en fait la clé AUTO_INCREMENT de la première des lignes insérées. Cela permet aux insertions à plusieurs lignes d'être reproduites correctement sur d'autres serveurs dans une configuration de réplication.

Si la colonne AUTO_INCREMENT fait partie de plusieurs index, MySQL génère des valeurs de séquence en utilisant l'index qui commence par la colonne AUTO_INCREMENT, s'il y en a une. Par exemple, si la table des animaux contenait les index PRIMARY KEY (grp, id) et INDEX (id), MySQL ignorerait la PRIMARY KEY pour générer des valeurs de séquence. Par conséquent, le tableau contiendrait une seule séquence, et non une séquence par valeur grp.

Pour commencer avec une valeur AUTO_INCREMENT autre que 1, définissez cette valeur avec CREATE TABLE ou ALTER TABLE, comme ceci :

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;Notes InnoDB

Pour les tables InnoDB, soyez prudent si vous modifiez la colonne contenant la valeur d'auto-incrémentation au milieu d'une séquence d'instructions INSERT. Par exemple, si vous utilisez une instruction UPDATE pour placer une nouvelle valeur plus grande dans la colonne d'auto-incrémentation, un INSERT ultérieur peut rencontrer une erreur "Entrée en double". Le test pour savoir si une valeur d'auto-incrémentation est déjà présente se produit si vous effectuez un DELETE suivi de plusieurs instructions INSERT, ou lorsque vous COMMIT la transaction, mais pas après une instruction UPDATE.

Notes MyISAM

Pour les tables MyISAM, vous pouvez spécifier AUTO_INCREMENT sur une colonne secondaire dans un index à plusieurs colonnes. Dans ce cas, la valeur générée pour la colonne AUTO_INCREMENT est calculée comme MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. Ceci est utile lorsque vous souhaitez placer des données dans des groupes ordonnés.

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 |
+--------+----+---------+

Dans ce cas (lorsque la colonne AUTO_INCREMENT fait partie d'un index à plusieurs colonnes), les valeurs AUTO_INCREMENT sont réutilisées si vous supprimez la ligne avec la plus grande valeur AUTO_INCREMENT dans n'importe quel groupe. Cela se produit même pour les tables MyISAM, pour lesquelles les valeurs AUTO_INCREMENT ne sont normalement pas réutilisées.

Lectures complémentaires

Plus d'informations sur AUTO_INCREMENT sont disponibles ici :

Comment affecter l'attribut AUTO_INCREMENT à une colonne :Section 13.1.17, « Syntaxe CREATE TABLE », et Section 13.1.7, « Syntaxe ALTER TABLE ».

Comment AUTO_INCREMENT se comporte en fonction du mode SQL NO_AUTO_VALUE_ON_ZERO :Section 5.1.7, « Modes SQL du serveur ».

Comment utiliser la fonction LAST_INSERT_ID() pour trouver la ligne qui contient la valeur AUTO_INCREMENT la plus récente :Section 12.14, « Fonctions d'information ».

Définition de la valeur AUTO_INCREMENT à utiliser :Section 5.1.4, « Variables système du serveur ».

AUTO_INCREMENT et réplication :Section 16.4.1.1, « Réplication et AUTO_INCREMENT ».

Variables système du serveur liées à AUTO_INCREMENT (auto_increment_increment et auto_increment_offset) pouvant être utilisées pour la réplication :Section 5.1.4, « Variables système du serveur ».

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