web-dev-qa-db-ja.com

Oracle-自動増分IDで新しい行を挿入

Workid列を持つワークキューテーブルがあります。 workID列には、自動的に増加する値があります。バックエンドでクエリを実行して新しい行を挿入し、workID列を自動的にインクリメントする方法はありますか?
nullを挿入しようとすると、エラーORA01400-workidにnullを挿入できません。

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

これまでに試したこと-テーブルの詳細を調べてみましたが、自動インクリメントは表示されませんでした。テーブルスクリプトは次のとおりです

"WORKID" NUMBER NOT NULL ENABLE,

データベース:Oracle 10g

既存のデータのスクリーンショット。 enter image description here


ANSWER:

助けてくれたすべての人に感謝しなければなりません。今日は素晴らしい学習体験でした。あなたのサポートがなければ、私はできませんでした。一番下の行は、すでにシーケンスとトリガーがあるテーブルに行を挿入しようとしていました。私がしなければならなかったのは、質問に適切なシーケンスを見つけ、そのシーケンスをクエリに呼び出すことだけでした。

皆さんから提供されたリンクは、これらのシーケンスを調べて、このworkid列に対応するシーケンスを見つけるのに役立ちました。みなさんのおかげで、私はみんなに親指を立てました。今日は別のドラゴンに取り組むことができ、患者のケアを一歩前進させることができます!」

29
Shaji

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

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;
/
18
Johnny Graber

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

sequencestriggersを使用する必要があります。

here 正しい方法を読んでください。 (「Oracleでの自動インクリメント列の作成」のステップごとのハウツー)

18
SlavaNov

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

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

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

8
Zsolt Sky
 ELXAN @ DB1> create table cedvel(id integer、ad varchar2(15)); 
 
 Table created。
 
 ELXAN @ DB1> alter table cedvel add constraint pk_ad primary key(id); 
 
 Table changed。
 
 ELXAN @ DB1> create test_seq start with 1 increment by 1; 
 
シーケンスが作成されました。
 
 ELXAN @ DB1> cedvel 
 REFERENCING NEW AS NEW OLDに挿入する前に、トリガーad_insert 
を作成または置換しますAS OLD 
各行に対して
 begin 
 test_seq.nextvalを選択して、new.id from dual; 
 end; 
/2 3 4 5 6 7 8 
 
トリガーが作成されました。
 
 ELXAN @ DB1> cedvel(ad)値( 'nese'); 
 
 1行が作成されました。
3
elxan

SEQUENCEまたはTRIGGERのいずれかを使用して、データベーステーブル内の特定の列の値を自動的にインクリメントできますが、TRIGGERSの使用がより適切です。適切な例とともにトリガーで使用される主要な句を含むOracleの次のドキュメントを参照してください。

CREATE TRIGGERステートメントを使用して、データベーストリガーを作成して有効にします。

  • テーブル、スキーマ、またはデータベースに関連付けられたストアドPL/SQLブロックまたは

  • 匿名のPL/SQLブロック、またはPL/SQLまたはJavaで実装されたプロシージャのコール

Oracle Databaseは、指定された条件が発生すると自動的にトリガーを実行します。 参照


以下は、次の単純な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などの値を自動的に生成し、指定されたテーブルの指定された列に挿入します。

2
Lion
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;

/

1
Vivek R

完全を期すために、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 ) ;
1
ragerdl

完全な方法を知っている、私はトリガーとシーケンスの例を含めました

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

1
Daniel Kennedy