具有约束,序列,触发器的基本主键/外键

时间:2013-04-27 23:46:50

标签: sql oracle11g

了解Oracle 11g中的学习者。我有一个问题,将一些行插入到两个由主/外键关系链接的表中。

基本上我创建一个以1000开头并以1递增的序列。

然后创建一个带有ST_ID列的“STORE”表

ST_ID列通过TRIGGER链接到SEQUENCE。

然后我有一个'EMPLOYEE'表,它有一个EST_ID字段,它是STORE表中ST_ID列的外键。

然而,当我尝试插入行时,我最初得到一个错误,说EST_ID不能为空。所以我为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');

1 个答案:

答案 0 :(得分:0)

当您尝试将数据插入到具有外键引用的表中时,它不会自动获取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