Sql 带约束、顺序、触发器的基本主键/外键
Oracle 11g中的学习者。我在将一些行插入到由主键/外键关系链接的两个表中时遇到问题 基本上我创建了一个序列,从1000开始,递增1 然后创建一个带有ST_ID列的“STORE”表 ST_ID列通过触发器链接到序列 然后我有一个“EMPLOYEE”表,它有一个EST_ID字段,它是STORE表中ST_ID列的外键 然而,当我尝试插入行时,我最初得到一个错误,说EST_ID不能为null。所以我为EST_ID创建了一个序列和触发器,现在我得到一个错误,说外键约束被违反了 我想那可能是错误的。我真的希望E_ID和EST_ID相同吗?我该如何实现这一点?用某种触发器 实际代码:Sql 带约束、顺序、触发器的基本主键/外键,sql,oracle11g,Sql,Oracle11g,Oracle 11g中的学习者。我在将一些行插入到由主键/外键关系链接的两个表中时遇到问题 基本上我创建了一个序列,从1000开始,递增1 然后创建一个带有ST_ID列的“STORE”表 ST_ID列通过触发器链接到序列 然后我有一个“EMPLOYEE”表,它有一个EST_ID字段,它是STORE表中ST_ID列的外键 然而,当我尝试插入行时,我最初得到一个错误,说EST_ID不能为null。所以我为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 INTO STORE
(ST_ID, STADDR_ID)
VALUES
(DEFAULT, DEFAULT);
INSERT INTO EMPLOYEE
(EF_NAME, EL_NAME)
VALUES
('James', 'Smith');
当您尝试将数据插入到具有外键引用的表中时,它不会自动获取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;
您还可以使用以下命令在store 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
当您尝试将数据插入到具有外键引用的表中时,它不会自动获取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;
您还可以使用以下命令在store 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
当您插入员工时,是否传递EST_ID的值?不,我不是。只有其他列的值。我想代码可能知道自动将与ST_ID相同的值插入EST_ID,但我想我完全错了?是的,它不会自动为您插入值,您需要传递该值。您是否在单个事务中同时在两个表中插入行?但如果序列和触发器自动插入ST_ID,如何传递该值?我是否需要另一个触发器说“将与ST_ID相同的值放入EST_ID?”(感谢您的帮助-非常感谢)您如何执行insert语句?它们是在同一个过程中一个接一个地执行的吗?当您插入到员工中时,是否传递EST_ID的值?不,我不是。只有其他列的值。我想代码可能知道自动将与ST_ID相同的值插入EST_ID,但我想我完全错了?是的,它不会自动为您插入值,您需要传递该值。您是否在单个事务中同时在两个表中插入行?但如果序列和触发器自动插入ST_ID,如何传递该值?我是否需要另一个触发器说“将与ST_ID相同的值放入EST_ID?”(感谢您的帮助-非常感谢)您如何执行insert语句?他们是在同一个程序中一个接一个地执行的吗?传奇-精彩的回答。万分感谢!传奇-精彩的回答。万分感谢!