j'ai créé une séquence en utilisant la requête suivante,
create sequence qname_id_seq start with 1 increment by 1 nocache;
Maintenant, quand j’essaie de créer une table qui utilise la séquence ci-dessus, elle jette l’erreur suivante,
Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 - "missing right parenthesis"
J'ai utilisé la requête suivante pour créer une table avec sequence.nextval,
CREATE TABLE qname
(
qname_id integer NOT NULL default qname_id_seq.nextval PRIMARY KEY,
qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);
Nous avons enfin les colonnes IDENTITY
comme beaucoup d’autres bases de données, dans le cas desquelles une séquence est générée automatiquement en arrière-plan. Cette solution est beaucoup plus rapide que celle basée sur un déclencheur comme on peut le voir dans cet article de blog .
Ainsi, votre création de table ressemblerait à ceci:
CREATE TABLE qname
(
qname_id integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL PRIMARY KEY,
qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);
Selon le documentation , vous ne pouvez pas faire cela:
Restriction sur les valeurs de colonne par défaut Une expression DEFAULT ne peut pas contenir de références à des fonctions PL/SQL ou à d'autres colonnes, les pseudocolonnes CURRVAL, NEXTVAL, LEVEL, PRIOR et ROWNUM, ni les constantes de date non entièrement spécifiées.
La méthode standard pour avoir des colonnes "incrémentation automatique" dans Oracle consiste à utiliser des déclencheurs, par exemple.
CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT
ON qname
FOR EACH ROW
-- Optionally restrict this trigger to fire only when really needed
WHEN (new.qname_id is null)
DECLARE
v_id qname.qname_id%TYPE;
BEGIN
-- Select a new value from the sequence into a local variable. As David
-- commented, this step is optional. You can directly select into :new.qname_id
SELECT qname_id_seq.nextval INTO v_id FROM DUAL;
-- :new references the record that you are about to insert into qname. Hence,
-- you can overwrite the value of :new.qname_id (qname.qname_id) with the value
-- obtained from your sequence, before inserting
:new.qname_id := v_id;
END my_trigger;
En savoir plus sur Oracle TRIGGERs dans la documentation
Dans Oracle 12c, vous pouvez maintenant spécifier les pseudocolonnes de séquence CURRVAL et NEXTVAL en tant que valeurs par défaut pour une colonne. Vous pouvez également utiliser des colonnes d'identité. voir:
Par exemple.,
CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
id NUMBER DEFAULT t1_seq.NEXTVAL,
description VARCHAR2(30)
);
Pour ma part, je préfère la solution de Lukas Edger.
Mais vous voudrez peut-être savoir qu’il existe également une fonction SYS_GUID qui peut être appliquée en tant que valeur par défaut à une colonne et générer des identifiants uniques.
vous pouvez en savoir plus sur les avantages et les inconvénients ici
Dans Oracle 12c , vous pouvez également déclarer une colonne d'identité
CREATE TABLE identity_test_tab (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
description VARCHAR2(30)
);
exemples et tests de performance ici ... où, est court, la conclusion est que utilisation directe de la séquence ou la nouvelle colonne d'identité sont beaucoup plus rapides que les déclencheurs.
Vous pouvez utiliser l'outil SQL Developer d'Oracle pour ce faire (la version de ma base de données Oracle est 11). Lors de la création d'un tableau, choisissez Option avancée et cliquez sur l'onglet Colonne d'identité en bas, puis choisissez Séquence de colonnes. Cela générera une colonne AUTO_INCREMENT (déclencheur et séquence correspondants).