了解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');
答案 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