Oracle - 自動インクリメンタルIDを持つ新しい行の挿入

workidカラムを持つworkqueueテーブルを持っています。workIDカラムは自動的にインクリメントされる値を持っています。バックエンドでクエリを実行して新しい行を挿入し、workIDカラムを自動的にインクリメントさせる方法はありますか?
NULLを挿入しようとすると、エラーORA01400 - Cannot insert null into workidがスローされます。

insert into WORKQUEUE  (facilitycode,workaction,description) values ('J', 'II',    'TESTVALUES')

これまで試したこと - テーブルの詳細を見てみましたが、オートインクリメントが見当たりません。テーブルのスクリプトは以下の通りです。

"WORKID" NUMBER NOT NULL ENABLE,

データベースオラクル10g

一部既存データのスクリーンショットです。

<hr&gt;

ANSWER:

一人一人、皆さんに感謝しなければなりません。今日はとても良い勉強になりましたし、皆さんのサポートがなければ、できなかったことです。要するに、私はすでにシーケンスとトリガーがあるテーブルに行を挿入しようとしていたのです。私がしなければならなかったことは、私の質問に適したシーケンスを見つけ、そのシーケンスをクエリに呼び出すことだけでした。

皆さんからいただいたリンクのおかげで、これらの配列を調べ、このworkidカラムに対応するものを見つけることができました。皆さんのおかげで、私は今日、別のドラゴンに挑むことができ、患者さんの治療が一歩前進するのを助けることができました! &quot;

質問へのコメント (3)

Oracleには、組み込みのauto_incrementはありません。

シーケンスとトリガーを使用する必要があります。

正しいやり方はこちらをご覧ください。("Creating auto-increment columns in Oracle"のステップバイステップのハウツー)

解説 (1)
ソリューション

自動インクリメント番号を取得するには、Oracleでシーケンスを使用する必要があります。 (こちら]1こちらを参照)。

CREATE SEQUENCE my_seq;

SELECT my_seq.NEXTVAL FROM DUAL; -- to get the next value

-- use in a trigger for your table demo
CREATE OR REPLACE TRIGGER demo_increment 
BEFORE INSERT ON demo
FOR EACH ROW

BEGIN
  SELECT my_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/
解説 (1)

これは、トリガーやシーケンスなしでそれを行う簡単な方法です。

insert into WORKQUEUE (ID, facilitycode, workaction, description)
  values ((select max(ID)+1 from WORKQUEUE), 'J', 'II', 'TESTVALUES')

それは私にとってはうまくいきましたが、空のテーブルではうまくいきませんでした。

解説 (2)
。
ELXAN @ DB1>テーブルcedvel(id integer、ad varchar2(15))を作成します。

テーブルが作成されました。

ELXAN @ DB1>テーブルセドベルを変更して制約を追加pk_ad主キー(id);。

テーブルが変更されました。

ELXAN @ DB1>シーケンスを作成します。test_seqは1ずつ1ずつ増加します。

シーケンスが作成されました。

ELXAN @ DB1>トリガーad_insertを作成または置換します。 cedvelに挿入する前に。 昔から新旧の参考。 各行。 始める。 test_seq.nextvalをデュアルから:new.idに選択します。 終わり;。 / 2 3 4 5 6 7 8。

トリガーが作成されました。

ELXAN @ DB1> cedvel(ad)値( 'nese')に挿入します。

1行が作成されました。 < / pre>。

解説 (0)

SEQUENCETRIGGERのどちらを使っても、データベーステーブルの指定したカラムの値を自動的に増加させることができますが、TRIGGERS` の使用がより適切でしょう。トリガーで使用される主要な句とその例については、Oracleの以下のドキュメントを参照してください。

CREATE TRIGGER文を使用して、データベースのトリガーを作成し、有効にする、です:

テーブル、スキーマに関連するストアドPL/SQLブロックです。 データベースや

  • 匿名のPL/SQLブロック、またはで実装されたプロシージャへの呼び出しです。 PL/SQLまたはJava

オラクルデータベースは、指定された条件が発生すると自動的にトリガーを実行する。参照です。


以下は、例として、カラムの最大値に基づいて、指定したテーブルに主キー値を挿入する簡単なTRIGGERです。スキーマ名やテーブル名などを変更して使用することができます。試しに使ってみてください。

/*Create a database trigger that generates automatically primary key values on the CITY table using the max function.*/

CREATE OR REPLACE TRIGGER PROJECT.PK_MAX_TRIGGER_CITY
BEFORE INSERT ON PROJECT.CITY
FOR EACH ROW
DECLARE 
    CNT NUMBER;
    PKV CITY.CITY_ID%TYPE;
    NO NUMBER;
BEGIN
    SELECT COUNT(*)INTO CNT FROM CITY;

    IF CNT=0 THEN
        PKV:='CT0001';
    ELSE
        SELECT 'CT'||LPAD(MAX(TO_NUMBER(SUBSTR(CITY_ID,3,LENGTH(CITY_ID)))+1),4,'0') INTO PKV
        FROM CITY;
    END IF; 
    :NEW.CITY_ID:=PKV;
END;

CT0001CT0002CT0002`などの値を自動的に生成し、指定したテーブルの指定したカラムに挿入します。

解説 (0)
SQL trigger for automatic date generation in oracle table:

CREATE OR REPLACE TRIGGER name_of_trigger

BEFORE INSERT

ON table_name

REFERENCING NEW AS NEW

FOR EACH ROW

BEGIN

SELECT sysdate INTO :NEW.column_name FROM dual;

END;

/。

解説 (0)

完全なノウハウ、トリガーとシーケンスの例を含めました。

create table temasforo(
idtemasforo NUMBER(5) PRIMARY KEY,
autor       VARCHAR2(50) NOT NULL,
fecha       DATE DEFAULT (sysdate),
asunto      LONG  );

create sequence temasforo_seq
  start with 1
  increment by 1
  nomaxvalue;

create or replace
trigger temasforo_trigger
  before insert on temasforo
  referencing OLD as old NEW as new
  for each row
  begin
      :new.idtemasforo:=temasforo_seq.nextval;
    end;

参照: http://thenullpointerexceptionx.blogspot.mx/2013/06/llaves-primarias-auto-incrementales-en.html

解説 (2)

完全を期すために、Oracle 12cがこの機能をサポートしていることを述べておきます。 また、トリガーアプローチよりも高速であると考えられます。 例:

CREATE TABLE foo
  (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY (
    START WITH 1 NOCACHE ORDER ) NOT NULL ,
    name       VARCHAR2 (50)
  )
  LOGGING ;
ALTER TABLE foo ADD CONSTRAINT foo_PK PRIMARY KEY ( id ) ;
解説 (0)