Oracle 11g の学習者です。主キー/外部キーの関係によってリンクされている 2 つのテーブルにいくつかの行を INSERT する際に問題が発生しています。
基本的に、1000 から開始して 1 ずつ増加するシーケンスを作成します。
次に、ST_ID 列を含む「STORE」テーブルを作成します
ST_ID 列は、TRIGGER を使用して SEQUENCE にリンクされています。
次に、STORE テーブルの ST_ID 列への外部キーである EST_ID フィールドを持つ「EMPLOYEE」テーブルがあります。
ただし、行を挿入しようとすると、最初に EST_ID を null にできないというエラーが発生しました。そのため、EST_ID のシーケンスとトリガーを作成しましたが、外部キー制約に違反しているというエラーが表示されます。
たぶん、やり方がまずかったと思います。本当に E_ID と EST_ID を同一にしたいのですか?どうすればそれを実現できますか? 何らかのトリガーで?
実際のコード:
CREATE SEQUENCE "STORSEQ" MINVALUE 1000 MAXVALUE 9999 INCREMENT BY 1 START WITH 1000 NOCACHE NOORDER
NOCYCLE ;
CREATE TABLE "STORE"
( "ST_ID" CHAR(4) NOT NULL ENABLE,
"STADDR_ID" CHAR(4) NOT NULL ENABLE,
CONSTRAINT "STORE_PK" PRIMARY KEY ("ST_ID") ENABLE
) ;
CREATE TABLE "EMPLOYEE"
( "E_ID" CHAR(8) NOT NULL ENABLE,
"EF_NAME" VARCHAR2(20) NOT NULL ENABLE,
"EL_NAME" VARCHAR2(20) NOT NULL ENABLE,
"EST_ID" CHAR(4) NOT NULL ENABLE,
CONSTRAINT "EMPLOYEE_PK" PRIMARY KEY ("E_ID") ENABLE
) ;
alter table "EMPLOYEE" add CONSTRAINT "EMPLOYEE_CON" foreign key ("EST_ID") references
"STORE" ("ST_ID")
/
CREATE OR REPLACE TRIGGER "BI_STORE"
before insert on "STORE"
for each row
begin
if :NEW."ST_ID" is null then
select "STORSEQ".nextval into :NEW."ST_ID" from dual;
end if;
end;
/
現時点では、INSERT コードは次のようになります。
INSERT INTO STORE
(ST_ID, STADDR_ID)
VALUES
(DEFAULT, DEFAULT);
INSERT INTO EMPLOYEE
(EF_NAME, EL_NAME)
VALUES
('James', 'Smith');