Workid列を持つワークキューテーブルがあります。 workID列には、自動的に増加する値があります。バックエンドでクエリを実行して新しい行を挿入し、workID列を自動的にインクリメントする方法はありますか?
nullを挿入しようとすると、エラーORA01400-workidにnullを挿入できません。
insert into WORKQUEUE (facilitycode,workaction,description) values ('J', 'II', 'TESTVALUES')
これまでに試したこと-テーブルの詳細を調べてみましたが、自動インクリメントは表示されませんでした。テーブルスクリプトは次のとおりです
"WORKID" NUMBER NOT NULL ENABLE,
データベース:Oracle 10g
既存のデータのスクリーンショット。
ANSWER:
助けてくれたすべての人に感謝しなければなりません。今日は素晴らしい学習体験でした。あなたのサポートがなければ、私はできませんでした。一番下の行は、すでにシーケンスとトリガーがあるテーブルに行を挿入しようとしていました。私がしなければならなかったのは、質問に適切なシーケンスを見つけ、そのシーケンスをクエリに呼び出すことだけでした。
皆さんから提供されたリンクは、これらのシーケンスを調べて、このworkid列に対応するシーケンスを見つけるのに役立ちました。みなさんのおかげで、私はみんなに親指を立てました。今日は別のドラゴンに取り組むことができ、患者のケアを一歩前進させることができます!」
自動インクリメント番号を取得するには、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;
/
Oracleには組み込みのauto_incrementはありません。
sequences
とtriggers
を使用する必要があります。
here 正しい方法を読んでください。 (「Oracleでの自動インクリメント列の作成」のステップごとのハウツー)
これは、トリガーやシーケンスなしで行う簡単な方法です。
insert into WORKQUEUE (ID, facilitycode, workaction, description)
values ((select max(ID)+1 from WORKQUEUE), 'J', 'II', 'TESTVALUES')
私にとってはうまくいきましたが、空のテーブルでは動作しませんでした。
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行が作成されました。
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;
CT0001
、CT0002
、CT0002
などの値を自動的に生成し、指定されたテーブルの指定された列に挿入します。
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;
/
完全を期すために、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 ) ;
完全な方法を知っている、私はトリガーとシーケンスの例を含めました
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