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>;
ANSWER:
一人一人、皆さんに感謝しなければなりません。今日はとても良い勉強になりましたし、皆さんのサポートがなければ、できなかったことです。要するに、私はすでにシーケンスとトリガーがあるテーブルに行を挿入しようとしていたのです。私がしなければならなかったことは、私の質問に適したシーケンスを見つけ、そのシーケンスをクエリに呼び出すことだけでした。
皆さんからいただいたリンクのおかげで、これらの配列を調べ、このworkidカラムに対応するものを見つけることができました。皆さんのおかげで、私は今日、別のドラゴンに挑むことができ、患者さんの治療が一歩前進するのを助けることができました! ";
自動インクリメント番号を取得するには、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;
/
。 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>。
SEQUENCEと
TRIGGERのどちらを使っても、データベーステーブルの指定したカラムの値を自動的に増加させることができますが、
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;
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;
/。
完全なノウハウ、トリガーとシーケンスの例を含めました。
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。
完全を期すために、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 ) ;