52

次のクエリを使用してシーケンスを作成しました。

create sequence qname_id_seq start with 1 increment by 1 nocache;

上記のシーケンスを使用するテーブルを作成しようとすると、次のエラーがスローされます。

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

次のクエリを使用して、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
);
4

5 に答える 5

62

オラクル 12c

IDENTITYこれで、他の多くのデータベースと同様に、バックグラウンドでシーケンスが自動生成される列がついに用意されました。このブログ投稿でわかるように、このソリューションはトリガーベースのソリューションよりもはるかに高速です。

したがって、テーブルの作成は次のようになります。

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 以下

documentationによると、それはできません:

デフォルト列値の制限事項 DEFAULT 式には、PL/SQL 関数や他の列、疑似列 CURRVAL、NEXTVAL、LEVEL、PRIOR、ROWNUM、または完全に指定されていない日付定数への参照を含めることはできません。

Oracle で「自動インクリメント」カラムを使用する標準的な方法は、トリガーを使用することです。

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;

Oracle TRIGGERの詳細については、ドキュメントを参照してください。

于 2012-05-16T07:28:03.553 に答える
48

Oracle 12c では、列のデフォルト値として CURRVAL および NEXTVAL シーケンス疑似列を指定できるようになりました。または、ID 列を使用できます。見る:

例えば、

CREATE SEQUENCE t1_seq;
CREATE TABLE t1 (
  id          NUMBER DEFAULT t1_seq.NEXTVAL,
  description VARCHAR2(30)
);
于 2013-08-09T18:37:20.507 に答える
8

私自身は、Lukas Edger のソリューションを好みます。

ただし、デフォルト値として列に適用して一意の ID を生成できる関数SYS_GUIDもあることに注意してください。

ここで長所と短所について詳しく読むことができます

于 2012-05-16T07:46:11.607 に答える
2

Oracle 12cでは、 ID 列を宣言することもできます

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

例とパフォーマンス テストはこちら... ここで、 は省略です。結論は、シーケンスまたは新しいID 列を直接使用すると、トリガーよりもはるかに高速であるということです。

于 2016-01-11T11:43:53.953 に答える