Sql 带约束、顺序、触发器的基本主键/外键

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创建了一个序列和触发器,现在我得到一个错误,说外键约束被违反了 我想那可能是错误的。

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

基本上我创建了一个序列,从1000开始,递增1

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

ST_ID列通过触发器链接到序列

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

然而,当我尝试插入行时,我最初得到一个错误,说EST_ID不能为null。所以我为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 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语句?他们是在同一个程序中一个接一个地执行的吗?传奇-精彩的回答。万分感谢!传奇-精彩的回答。万分感谢!