créer la table avec la séquence.nextval dans oracle [dupliquer]

cette question a déjà une réponse ici:

  • comment créer une id avec AUTO_ incrément sur Oracle? 16 réponses

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, il est jetant 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 séquence.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
);
44
demandé sur Murali 2012-05-16 11:25:40

5 réponses

Oracle 12c

Nous avons maintenant enfin avoir IDENTITY colonnes comme beaucoup d'autres bases de données, d'une séquence est générée automatiquement en coulisses. Cette solution est beaucoup plus rapide qu'un déclencheur comme peut être vu dans ce billet 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
);

Oracle 11g et inférieur

selon le documentation , vous ne pouvez pas faire cela:

Restriction on Default Column Values A DEFAULT expression cannot contain references to PL / SQL functions or to other columns, the pseudocolumns CURRVAL, NEXTVAL, LEVEL, PRIOR, and ROWNUM, or date constants that are not fully specified.

la méthode standard pour avoir des colonnes "auto increment" dans Oracle est D'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

53
répondu Lukas Eder 2017-01-06 11:00:03

dans Oracle 12c, vous pouvez maintenant spécifier les pseudocolumns des séquences CURRVAL et NEXTVAL comme valeurs par défaut pour une colonne. Alternativement, vous pouvez utiliser des colonnes d'Identité; voir:

E. G.,

CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);
45
répondu michael 2013-08-09 18:37:20

je préfère la solution de Lukas Edger.

mais vous pourriez vouloir savoir qu'il y a aussi une fonction SYS_GUID qui peut être appliquée comme valeur par défaut à une colonne et générer des id uniques.

vous pouvez en savoir plus sur pour et contre ici

8
répondu A.B.Cade 2012-05-16 07:46:11

Dans Oracle 12c , vous pouvez aussi déclarer un "151920920 d'identité" de la colonne

CREATE TABLE identity_test_tab (
  id          NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  description VARCHAR2(30)
);

exemples et tests de performance ici ... dans le cas des shorts, la conclusion est que le utilisation directe de la séquence ou le nouveau colonne d'identité sont beaucoup plus rapide que les déclencheurs.

2
répondu kkk 2016-01-11 11:43:53

vous pouvez utiliser L'outil SQL Developer D'Oracle pour faire cela (ma version Oracle DB est 11). En créant une table, choisissez option avancée et cliquez sur colonne identité onglet en bas et de là, choisissez colonne séquence . Cela générera une colonne AUTO_ incrément (déclencheur et Squence correspondants) pour vous.

1
répondu ddsultan 2015-06-08 08:27:58