Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Erstellen Sie eine Tabelle mit sequence.nextval in Oracle

Oracle 12c

Wir haben jetzt endlich IDENTITY Spalten wie viele andere Datenbanken, bei denen hinter den Kulissen automatisch eine Sequenz generiert wird. Diese Lösung ist viel schneller als eine Trigger-basierte Lösung, wie in diesem Blogbeitrag 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 niedriger

Laut Dokumentation ist das nicht möglich:

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

Die Standardmethode für "Auto-Increment"-Spalten in Oracle ist die Verwendung von Triggern, z. B.

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;

Lesen Sie mehr über Oracle TRIGGERs in der Dokumentation