2013-04-27 62 views
0

Oracle 11g中的学习者。我有一个问题,将一些行插入两个通过主键/外键关联链接的表中。具有约束条件,顺序,触发器的基本主键/外键

基本上我创建序列通过1

开始与1000和增量然后创建一个“存储”表具有ST_ID柱

的ST_ID列链接到与触发器序列。

然后我有一个'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'); 
+0

当你插入的员工,你传递价值EST_ID插入,而不触发的店铺标识表ID? – 2013-04-27 23:52:58

+0

不,我不是。只是其他列的值。 我以为代码可能知道自动将相同的值插入ST_ID作为EST_ID,但我想我完全错了吗? – SJSL 2013-04-27 23:55:58

+0

是的,它不会自动为您插入值,您需要传递该值。你是否在单个事务中将表中的行插入? – 2013-04-27 23:59:30

回答

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; 

您也可以使用此

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 
+0

传奇 - 辉煌的答案。太感谢了! – SJSL 2013-04-28 00:19:37