我使用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;
答案 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
命令添加列并删除并重新创建约束。