1

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');
4

1 に答える 1

1

外部キー参照を持つテーブルにデータを挿入しようとすると、id の値が自動的に取得されないため、その値を渡す必要があります。

あなたはこれを行うことができます:

declare 
v_store_id integer;
begin
  INSERT INTO STORE (ST_ID, STADDR_ID) VALUES (DEFAULT, DEFAULT)
  RETURNING ST_ID INTO v_Store_id; 

  INSERT INTO EMPLOYEE (EF_NAME, EL_NAME, EST_ID) 
   VALUES ('James', 'Smith', v_store_id);
end;

これを使用して、トリガーなしで店舗IDテーブルにIDを挿入することもできます

declare 
v_store_id integer;
begin
  INSERT INTO STORE (ST_ID, STADDR_ID) VALUES ("STORSEQ".nextval, DEFAULT)
  RETURNING ST_ID INTO v_Store_id; 

  INSERT INTO EMPLOYEE (EF_NAME, EL_NAME, EST_ID) 
  VALUES ('James', 'Smith', v_store_id);
end
于 2013-04-28T00:07:41.173 に答える