MySQL équivalent de SEQUENCE.NEXTVAL d'Oracle
J'ai besoin d'être en mesure de générer de l'exécution d'une requête qui retourne la valeur de l'ID sur le tableau suivant:
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
)
Dans Oracle, vous pouvez appeler NEXTVAL sur une séquence et il vous donne la séquence suivante (note: sans avoir à faire un insert sur la table).
Après recherche sur google, j'ai trouvé que vous pouvez trouver la valeur actuelle de auto_increment par l'aide de la requête suivante:
SELECT Auto_increment
FROM information_schema.tables
WHERE table_name='animals';
Le problème c'est que je voudrais la valeur de l'incrément à chaque fois que la valeur est interrogé. Dans Oracle, lorsque vous appelez nextval, la valeur de la séquence est incrémenté même si vous n'avez pas insérer une ligne dans une table.
Est-il possible que je peux modifier la requête ci-dessus, de sorte que la valeur retournée sera toujours différent de la dernière fois que la requête a été appelé? c'est à dire de type Auto_increment est incrémenté à chaque fois qu'il est vérifié et lorsqu'il est utilisé sur une requête, elle serait d'utiliser une nouvelle valeur.
Je suis à l'aide de Printemps JDBCTemplate donc, si on peut le faire en une seule requête le mieux.
source d'informationauteur ziggy
Vous devez vous connecter pour publier un commentaire.
Cet exemple avec MyISAM démontre une façon de mettre en œuvre votre propre compteur à l'aide de contrefil requêtes:
http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
Quoi avez-vous besoin de créer un espace pour? Pour réserver les Identifiants?
Je préfère "fix" de la conception à tous les coûts et de mettre à jour les autres modules au lieu de toucher une séquence.
Au lieu de simplement l'incrémentation de la séquence de manière explicite, j'avais le sous-entendre par l'insertion d'une ligne par défaut (marqué non valide) pour chaque code d'allouer et de retourner l'id. Cette approche est cohérente et portable.
Plus tard, au lieu de forcer les inserts en utilisant explicitement la valeur de la séquence, vous pouvez mettre à jour ces valeurs par défaut des lignes correspondantes de la séquence de valeurs.
Cela nécessite plus de mémoire, mais pas de verrou. La collecte des ordures sur l'expiration des lignes peut vous aider ici. 'insérer ou mettre à jour des déclarations de pouvoir recréer des ordures collectées lignes, je ne voudrais pas faire cela.
http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html
3.6.9. À l'aide de AUTO_INCREMENT
L'AUTO_INCREMENT attribut peut être utilisé pour générer une identité unique pour les nouvelles lignes:
Aucune valeur n'a été spécifiée pour le type de colonne AUTO_INCREMENT, donc MySQL attribué des numéros de séquence automatiquement. Vous pouvez également affecter explicitement la valeur NULL ou 0 de la colonne de générer des numéros de séquence.
Vous pouvez récupérer la dernière valeur AUTO_INCREMENT avec la LAST_INSERT_ID() fonction SQL ou le mysql_insert_id() de l'API C de la fonction. Ces fonctions sont spécifiques à la connexion, de sorte que leurs valeurs de retour ne sont pas affectés par une autre connexion qui est également l'exécution d'insertions.
Utiliser le plus petit nombre entier de type de données pour le type de colonne AUTO_INCREMENT qui est assez grand pour contenir le maximum de valeur de la séquence dont vous aurez besoin. Lorsque la colonne atteint la limite supérieure du type de données, la prochaine tentative de générer un numéro de séquence échoue. Utiliser l'attribut UNSIGNED, si possible, pour permettre une plus grande portée. Par exemple, si vous utilisez TINYINT, la valeur maximale admissible du numéro de séquence est de 127. Pour TINYINT UNSIGNED, le maximum est de 255. Voir Section 11.2.1, “les Types Integer (Valeur Exacte) - ENTIER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT” pour les gammes de tous les types d'entiers.
Note
Pour une insertion de plusieurs lignes, LAST_INSERT_ID() et mysql_insert_id() retourne en fait l'AUTO_INCREMENT de la clé à partir de la première des lignes insérées. Cela permet à plusieurs lignes de montage peut être reproduite correctement sur d'autres serveurs dans une configuration de réplication.
Si le type de colonne AUTO_INCREMENT est partie de plusieurs indices, MySQL génère la séquence de valeurs à l'aide de l'index qui commence avec le type de colonne AUTO_INCREMENT, si il y en a un. Par exemple, si les animaux tableau figurant index de CLÉ PRIMAIRE (grp, id) et un INDEX (id), MySQL serait ignorer la CLÉ PRIMAIRE pour la génération de la séquence de valeurs. Comme un résultat, le tableau contiendra une seule séquence, pas une séquence par grp valeur.
De commencer avec un AUTO_INCREMENT valeur autre que 1, définissez cette valeur à l'aide de CREATE TABLE ou ALTER TABLE, comme ceci:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 100;
MyISAM Notes
Pour les tables MyISAM, être prudent si vous modifiez la colonne contenant la valeur d'incrémentation automatique au moyen d'une séquence d'instructions INSERT. Par exemple, si vous utilisez une instruction de mise à JOUR pour mettre une nouvelle, plus grande valeur dans l'auto-incrémentée, un INSERT pourrait rencontrer une “Double entrée” erreur. Le tester si une valeur d'incrémentation automatique est déjà présent se produit si vous faites une SUPPRESSION suivie par plus d'instructions INSERT, ou lorsque vous validez la transaction, mais pas après une mise à JOUR de la déclaration.
MyISAM Notes
Pour les tables MyISAM, vous pouvez spécifier AUTO_INCREMENT sur une seconde colonne dans un index multi-colonnes. Dans ce cas, la valeur générée pour le type de colonne AUTO_INCREMENT est calculé comme MAX(auto_increment_column) + 1 OÙ prefix=-préfixe. Ceci est utile lorsque vous voulez mettre des données en ordonnée groupes.
Dans ce cas (lorsque le type de colonne AUTO_INCREMENT fait partie d'un index multi-colonnes), de type AUTO_INCREMENT valeurs sont réutilisés si vous supprimez la ligne avec la plus grande valeur AUTO_INCREMENT dans aucun groupe. C'est le cas même pour les tables MyISAM, pour lesquels les valeurs AUTO_INCREMENT, normalement, ne sont pas réutilisées.
Lecture
Plus d'informations sur AUTO_INCREMENT est disponible ici:
Comment assigner l'attribut AUTO_INCREMENT à une colonne: Section 13.1.17, “Syntaxe CREATE TABLE”, et de l'Article 13.1.7, “Syntaxe ALTER TABLE”.
Comment AUTO_INCREMENT se comporte en fonction de la NO_AUTO_VALUE_ON_ZERO mode SQL: Section 5.1.7, “Serveur SQL Modes”.
Comment utiliser le LAST_INSERT_ID() pour trouver la ligne qui contient la plus récente de type AUTO_INCREMENT de la valeur: l'Article 12.14, “Fonctions d'Information”.
Réglage de la valeur AUTO_INCREMENT à être utilisé: la Section 5.1.4, de Serveur “Variables Système”.
AUTO_INCREMENT et de réplication: la Section 16.4.1.1, “la Réplication et de la AUTO_INCREMENT”.
Serveur-système de variables liées à la AUTO_INCREMENT (auto_increment_increment et auto_increment_offset) qui peut être utilisé pour la réplication: la Section 5.1.4, de Serveur “Variables Système”.
http://search.oracle.com/search/search?q=auto_increment&groupe=Documentation&x=0&y=0
Vous pouvez ajouter votre propre MySQL fonction - comme l'a démontré à http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/vous permettant de vous faire quelque chose comme ceci:
MySQL utilise
AUTO_INCREMENT
qui sert les fins. Mais il y a en dessous de différences:MySQL
AUTO_INCREMENT
à OracleSEQUENCE
Différencessi vous désirez voir une SÉQUENCE de mise en œuvre avec MySQL , peut faire avec la SP.
Consultez ci-dessous le lien explique tout ce que vous voulez.
http://ronaldbradford.com/blog/sequences-in-mysql-2006-01-26/
Vous voulez la prochaine valeur sur la table de sorte que vous pouvez faire des lignes qui ne sont pas encore insérés sans déranger les autres processus qui sont à l'aide de l'auto-incrément?
Certaines options:
Aller de l'avant et insérez les lignes pour "utiliser la séquence", les marquer comme étant en attente et mettre à jour plus tard.
Insérer dans une transaction et d'annuler la transaction - la fonction de numéro de séquence doit s'habituer et faire un "écart" dans le tableau normalement - que le nombre est maintenant gratuit que vous pouvez utiliser.
Avec Oracle, la séquence est totalement indépendante de la table, de sorte que les processus peuvent utiliser la séquence ou pas (et ils peuvent aussi utiliser la même séquence pour les tables différentes). Dans cette veine, vous pourriez mettre en œuvre une séquence seule table qui vous accédez au moyen d'une sorte de fonction, et pour les autres processus qui ont besoin de s'appuyer sur l'auto-incrémentation, de supprimer l'auto-incrémentation et de l'utilisation d'un déclencheur qui assigne à partir de la séquence de la fonction si aucun id n'est fourni.
Ont un coup d'oeil à MariaDBs
SEQUENCE
Moteur. Avec elle, vous pouvez générer des séquences aussi facile queDétails ici: https://mariadb.com/kb/en/mariadb/sequence/
Avec cela, vous devriez être en mesure de faire quelque chose comme