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');
当你插入的员工,你传递价值EST_ID插入,而不触发的店铺标识表ID? – 2013-04-27 23:52:58
不,我不是。只是其他列的值。 我以为代码可能知道自动将相同的值插入ST_ID作为EST_ID,但我想我完全错了吗? – SJSL 2013-04-27 23:55:58
是的,它不会自动为您插入值,您需要传递该值。你是否在单个事务中将表中的行插入? – 2013-04-27 23:59:30