如何在SQL开发人员中插入行时设置fk

时间:2013-11-16 15:25:13

标签: oracle oracle-sqldeveloper oracle-xe

我使用SQL Developer(使用Oracle XE)设置3个表并添加PK,FK ..现在我想添加一些行......

INSERT INTO "ADMIN"."POST" (NAME_POST) VALUES ('asd')

ORA-02291: integrity constraint (ADMIN.POST_DEPARTMENT_FK1) violated - parent key not found
ORA-06512: at line 1

我不知道在哪里可以找到FK来选择一个!使用SQL Developer,我只填写没有FK的列,所以我需要帮助才能找到如何使用SQLDeveloper正确完成。


新信息:

我不知道为什么,但我在DEPARTMENT和POST之间有一对一的关系。

 CREATE TABLE "ADMIN"."POST" 
   (    "ID_POST" NUMBER(*,0) NOT NULL ENABLE, 
    "NAME_POST" VARCHAR2(40 BYTE) NOT NULL ENABLE, 
     CONSTRAINT "POST_PK" PRIMARY KEY ("ID_POST")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"  ENABLE, 
     CONSTRAINT "POST_DEPARTMENT_FK1" FOREIGN KEY ("ID_POST")
      REFERENCES "ADMIN"."DEPARTMENT" ("ID_DEPARTMENT") ON DELETE CASCADE ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM" ;

  CREATE OR REPLACE TRIGGER "ADMIN"."POST_ID" 
BEFORE INSERT ON POST 
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
  if(:new.ID_POST is null) then
  SELECT S_POST.nextval
  INTO :new.ID_POST
  FROM dual;
  end if;
END;
/
ALTER TRIGGER "ADMIN"."POST_ID" ENABLE;

1 个答案:

答案 0 :(得分:0)

  

并发布了FK CONSTRAINT“POST_DEPARTMENT_FK1”FOREIGN KEY   (“ID_POST”)REFERENCES“ADMIN”。“DEPARTMENT”(“ID_DEPARTMENT”)ON   删除CASCADE ENABLE

嗯,这是你的问题。你有一个id_post字段 - 希望 - 是post表的主键,触发器支持它。但是你也已经将相同的列作为department表的外键。通过这样做,您创建了一对一的关系。这不起作用 - 触发器从其序列中分配新的post_id值,如果department表具有相同值的PK,则仅仅是侥幸。

假设您的post表格也有id_department列,则FK应为:

CONSTRAINT "POST_DEPARTMENT_FK1"
FOREIGN KEY ("ID_DEPARTMENT")
REFERENCES "ADMIN"."DEPARTMENT" ("ID_DEPARTMENT")
ON DELETE CASCADE ENABLE

听起来你也说SQL Developer没有在数据编辑器中向你显示FK列department_id。我能看到的唯一方法就是在通过alter命令添加该列之前打开表视图。如果表定义更改,则表视图不会自动刷新。关闭表并重新打开它,您将看到当前结构,包括FK列。


好的,在您的问题编辑中,您没有要保留您想要成为FK的department_id的列。您需要包含该列,并使其成为FK:

CREATE TABLE "ADMIN"."POST" 
   (    "ID_POST" NUMBER(*,0) NOT NULL ENABLE, 
    "NAME_POST" VARCHAR2(40 BYTE) NOT NULL ENABLE, 
    "ID_DEPARTMENT" NUMBER(*,0) NOT NULL,
     CONSTRAINT "POST_PK" PRIMARY KEY ("ID_POST")
  USING INDEX ...
  TABLESPACE "SYSTEM"  ENABLE, 
     CONSTRAINT "POST_DEPARTMENT_FK1" FOREIGN KEY ("ID_DEPARTMENT")
      REFERENCES "ADMIN"."DEPARTMENT" ("ID_DEPARTMENT")
      ON DELETE CASCADE ENABLE
   ) ...
  )
  TABLESPACE "SYSTEM" ;

将自己的对象放在SYSTEM表空间中并不是一个好主意;为ADMIN个对象创建一个新的。

如果您还没有数据,最简单的方法是删除并重新创建表格。否则,您可以使用alter table命令添加列并删除并重新创建约束。