it-swarm.com.de

Erstellen Sie eine Tabelle mit sequence.nextval in Oracle

ich habe eine Sequenz mit der folgenden Abfrage erstellt,

create sequence qname_id_seq start with 1 increment by 1 nocache;

Wenn ich jetzt versuche, eine Tabelle zu erstellen, die die obige Reihenfolge verwendet, wird der folgende Fehler ausgegeben:

Error report:
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"

Ich habe die folgende Abfrage verwendet, um eine Tabelle mit sequence.nextval zu erstellen.

CREATE TABLE qname
(
    qname_id integer NOT NULL default qname_id_seq.nextval PRIMARY KEY,
    qname    VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE
);
45
Murali

Oracle 12c

Wir haben jetzt endlich IDENTITY Spalten wie viele andere Datenbanken, bei denen eine Sequenz hinter den Kulissen automatisch generiert wird. Diese Lösung ist viel schneller als eine Trigger-basierte wie in diesem Blog-Beitrag zu sehen ist .

Ihre Tabellenerstellung würde also so aussehen:

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 und darunter

Laut Dokumentation können Sie das nicht tun:

Einschränkung der Standardspaltenwerte Ein DEFAULT-Ausdruck darf keine Verweise auf PL/SQL-Funktionen oder auf andere Spalten, die Pseudospalten CURRVAL, NEXTVAL, LEVEL, PRIOR und ROWNUM oder Datumskonstanten enthalten, die nicht vollständig angegeben sind.

Die Standardmethode für das automatische Inkrementieren von Spalten in Oracle ist die Verwendung von Triggern, z.

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;

Weitere Informationen zu Oracle TRIGGERs finden Sie in der Dokumentation

56
Lukas Eder

In Oracle 12c können Sie jetzt die Pseudospalten CURRVAL und NEXTVAL als Standardwerte für eine Spalte angeben. Alternativ können Sie Identitätsspalten verwenden. sehen:

Z.B.,

CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);
45
michael

Ich selbst bevorzuge die Lösung von Lukas Edger.

Vielleicht möchten Sie aber auch wissen, dass es eine Funktion SYS_GUID gibt, die als Standardwert auf eine Spalte angewendet und eindeutige IDs generiert werden kann.

lesen Sie mehr über Vor- und Nachteile hier

8
A.B.Cade

In Oracle 12c können Sie auch eine Identitätsspalte deklarieren.

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

beispiele & Leistungstests hier ... wobei, kurz gesagt, die Schlussfolgerung ist, dass die direkte Verwendung der Sequenz oder die neue Identitätsspalte sind viel schneller als die Trigger.

2
kkk

Verwenden Sie dazu das Oracle-Tool SQL Developer (My Oracle DB Version 11). Wählen Sie beim Erstellen einer Tabelle Erweiterte Option und klicken Sie unten auf die Registerkarte Identitätsspalte. Wählen Sie dann Spaltenreihenfolge. Dadurch wird eine AUTO_INCREMENT -Spalte (entsprechender Trigger und Squence) für Sie generiert.

2
ddsultan