Il semble qu'il n'y ait pas de concept AUTO_INCREMENT dans Oracle, jusqu'à la version 11g incluse.
Comment puis-je créer une colonne qui se comporte comme l'incrémentation automatique dans Oracle 11g?
sql
oracle
auto-increment
Sushan Ghimire
la source
la source
BEFORE INSERT
déclencheur sur la table et extraire des valeurs d'une séquence pour créer une incrémentation automatiqueRéponses:
Il n'y a pas de colonnes "auto_increment" ou "identité" dans Oracle à partir d'Oracle 11g . Cependant, vous pouvez le modéliser facilement avec une séquence et un déclencheur:
Définition du tableau:
Définition du déclencheur:
MISE À JOUR:
IDENTITY
est désormais disponible sur Oracle 12c:ou spécifiez des valeurs de début et d'incrément, empêchant également toute insertion dans la colonne d'identité (
GENERATED ALWAYS
) (encore une fois, Oracle 12c + uniquement)Alternativement, Oracle 12 permet également d'utiliser une séquence comme valeur par défaut:
la source
dept_seq
vient!SELECT .. INTO
le déclencheur que vous pouvez simplement faire:new.id := dept_seq.NEXTVAL;
.SYS_GUID
renvoie un GUID - un ID unique au monde. ASYS_GUID
est unRAW(16)
. Il ne génère pas de valeur numérique incrémentielle.Si vous souhaitez créer une clé numérique incrémentielle, vous souhaiterez créer une séquence.
Vous utiliseriez alors cette séquence dans votre
INSERT
déclarationOu vous pouvez définir un déclencheur qui remplit automatiquement la valeur de la clé primaire à l'aide de la séquence
Si vous utilisez Oracle 11.1 ou une version ultérieure, vous pouvez simplifier un peu le déclencheur
Si vous voulez vraiment utiliser
SYS_GUID
la source
CACHE 100; in CREATE SEQUENCE name_of_sequence START WITH 1 INCREMENT BY 1 CACHE 100;
-il?SYS_GUID()
est unRAW(16)
, pas 32.SYS_GUID
documentation déclare unraw(32)
qui m'a dérouté.Dans Oracle 12c, vous pourriez faire quelque chose comme,
Et dans Oracle (Pre 12c).
la source
IDENTITY
exemple est beaucoup plus clair dans cette réponse.WHEN (new.MAP_ID IS NULL)
n'est pas dans la réponse acceptée. A voté.WHEN ( new.MAP_ID is null)
n'est pas un bon code dans ce cas et est déjà expliqué dans la section commentaire par @ABCade sous réponse acceptée .. lisez;)CREATE OR REPLACE TRIGGER
àEND;
, j'obtiens une fenêtre "Enter Binds". Si je clique sur "Appliquer" et que je ne fais rien d'autre dans cette fenêtre, puis que j'exécute laALTER TRIGGER
commande, tout va bien, mais j'aimerais qu'il y ait un moyen de se débarrasser par programme de cette fenêtre contextuelle et de tout exécuter ensemble. Si vous l'essayez tout à fait, vous obtenezPLS-00103: Encountered the symbol 'ALTER'
et il n'aime pas nonEXECUTE IMMEDIATE
plus (même erreur, dit simplement à laEncountered the symbol 'EXECUTE'
place).[42000][907] ORA-00907: missing right parenthesis
lors de l'exécution de la version pour Oracle 12c. Une idée ?Voici trois saveurs:
RAW
type de données.x
est la colonne d'identité. RemplacezFOO
par le nom de votre table dans chacun des exemples.mise à jour:
Oracle 12c présente ces deux variantes qui ne dépendent pas des déclencheurs:
Le premier utilise une séquence de manière traditionnelle; le second gère la valeur en interne.
la source
En supposant que vous voulez dire une colonne comme la colonne d'identité SQL Server?
Dans Oracle, vous utilisez une SEQUENCE pour obtenir la même fonctionnalité. Je vais voir si je peux trouver un bon lien et le poster ici.
Mise à jour: on dirait que vous l'avez trouvée vous-même. Voici quand même le lien: http://www.techonthenet.com/oracle/sequences.php
la source
Oracle Database 12c a introduit Identity, une colonne auto-incrémentielle (générée par le système). Dans les versions de base de données précédentes (jusqu'à 11g), vous implémentez généralement une identité en créant une séquence et un déclencheur. À partir de 12c, vous pouvez créer votre propre table et définir la colonne qui doit être générée en tant qu'identité.
L'article suivant explique comment l'utiliser:
Colonnes d'identité - Une nouvelle entrée dans Oracle Database 12c
la source
Trigger
etSequence
peut être utilisé lorsque vous voulez un numéro de série que n'importe qui peut facilement lire / mémoriser / comprendre. Mais si vous ne souhaitez pas gérer la colonne ID (comme emp_id) de cette manière, et que la valeur de cette colonne n'est pas très considérable, vous pouvez l'utiliserSYS_GUID()
lors de la création de la table pour obtenir l'incrémentation automatique comme ceci.Votre
emp_id
colonne acceptera désormais la "valeur d'identifiant unique au monde". vous pouvez insérer de la valeur dans la table en ignorant la colonne emp_id comme celle-ci.Ainsi, il insérera une valeur unique dans votre
emp_id
colonne.la source
SYS_GUID()
ses valeurs d'identification seront également?À partir d'Oracle 12c, les colonnes d'identité sont prises en charge de deux manières:
Sequence + Table - Dans cette solution, vous créez toujours une séquence comme vous le feriez normalement, puis vous utilisez le DDL suivant:
CRÉER LA TABLE MyTable (ID NUMBER DEFAULT MyTable_Seq.NEXTVAL , ...)
Table uniquement - Dans cette solution, aucune séquence n'est explicitement spécifiée. Vous utiliseriez le DDL suivant:
CRÉER TABLE MyTable (NUMÉRO D'IDENTIFIÉ GÉNÉRÉ COMME IDENTITÉ , ...)
Si vous utilisez la première manière, elle est rétrocompatible avec la manière existante de faire les choses. Le second est un peu plus simple et est plus en ligne avec le reste des systèmes RDMS.
la source
il est appelé
Identity Columns
et n'est disponible que depuis Oracle Oracle 12cexemple d'insertion dans
Identity Columns
comme ci-dessousvous ne pouvez PAS insérer comme ci-dessous
lien utile
la source
Voici une solution complète pour la gestion des exceptions / erreurs pour l'incrémentation automatique, cette solution est rétrocompatible et fonctionnera sur 11g et 12c, en particulier si l'application est en production.
Veuillez remplacer «TABLE_NAME» par votre nom de table approprié
la source
Voici comment je l'ai fait sur une table et une colonne existantes (nommées id):
la source
la source
la source
oracle a des séquences ET des colonnes d'identité en 12c
http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php#identity-columns
J'ai trouvé cela mais je ne sais pas ce qu'est rdb 7 http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf
la source
seulement je dois juste changer le nom de la table (AUDITLOGS) avec votre nom de table et new.id avec new.column_name
la source
Peut-être essayez simplement ce script simple:
http://www.hlavaj.sk/ai.php
Le résultat est:
la source
select
versions Oracle modernes. Vous pouvez simplement utiliser:new.pk := TABLE_PK_SEQ.NEXTVAL