问题描述
CREATE TABLE "RESEARCH_DEP"."RESEARCH_TV_COMPANY"
( "CID" NUMBER(38,0) NOT NULL ENABLE,"SOURCE_ID" NUMBER(2,0),CONSTRAINT "PK_RESEARCH_TV_COMPANY_1" PRIMARY KEY ("CID","SOURCE_ID")
USING INDEX (CREATE UNIQUE INDEX "RESEARCH_DEP"."IDX_TV_COMPANY_CID_SOURCE_ID" ON "RESEARCH_DEP"."RESEARCH_TV_COMPANY" ("CID","SOURCE_ID")
CREATE TABLE "RESEARCH_DEP"."RESEARCH_METRICS_PHARMA_AUD"
( "ID" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE NOT NULL ENABLE,"MEDIA_COMPANY_ID" NUMBER(*,0) NOT NULL ENABLE
)
需要
ALTER TABLE RESEARCH_DEP.RESEARCH_METRICS_PHARMA_AUD
ADD CONSTRAINT fk_METRICS_PHARMA_AUD_TV_COMPANY_ID
FOREIGN KEY (MEDIA_COMPANY_ID,SOURCE_ID) REFERENCES RESEARCH_DEP.RESEARCH_TV_COMPANY(CID,SOURCE_ID);
ORA-02298:未找到父键
我是否需要创建组合列:CID,SOURCE_ID? 要么 创建值序列两列 oracle CID,SOURCE_ID ?
解决方法
您的代码或多或少没问题:
SQL> create table research_tv_company
2 (cid number,3 source_id number,4 --
5 constraint pk_rtc primary key (cid,source_id)
6 );
Table created.
SQL> create table research_metrics_pharma_aud
2 (id number,3 source_id number,4 media_company_id number
5 );
Table created.
SQL> alter table research_metrics_pharma_aud
2 add constraint fk_rmpa_rtc
3 foreign key (media_company_id,source_id)
4 references research_tv_company (cid,source_id);
Table altered.
SQL>
注意我
- 删除双引号
- 删除了主键列的
NOT NULL
(无论如何它们都不能是NULL
) - 没有创建任何索引,因此 Oracle 将 - 连同表创建 - 创建一个主键约束和唯一索引来支持它
- 因为我使用的是 11gXE 并且它不支持标识列,所以我删除了它 从第二个表;我必须通过触发器强制执行它。您不必对此做任何事情,只需说(这样您就不会怀疑它去了哪里?)
您遇到的错误:
ORA-02298:未找到父键
表示第二个表中的 (media_company_id,source_id
) 组合在第一个表中不存在作为 (cid,source_id
) 对。举例说明:
先删除外键约束(否则我做不到):
SQL> alter table research_metrics_pharma_aud drop constraint fk_rmpa_rtc;
Table altered.
在第一个(主)表中插入一行:
SQL> insert into research_tv_company (cid,source_id) values (1,1);
1 row created.
在第二个(明细)表中插入两行;第一个组合有效,第二个组合无效,因为 (2,2) 在 research_tv_company
中不存在:
SQL> insert into research_metrics_pharma_aud (id,source_id,media_company_id) values (1,1,1);
1 row created.
SQL> insert into research_metrics_pharma_aud (id,media_company_id) values (2,2,2);
1 row created.
SQL>
如果我们尝试创建一个外键约束:
SQL> alter table research_metrics_pharma_aud
2 add constraint fk_rmpa_rtc
3 foreign key (media_company_id,source_id);
add constraint fk_rmpa_rtc
*
ERROR at line 2:
ORA-02298: cannot validate (SCOTT.FK_RMPA_RTC) - parent keys not found
SQL>
看到了吗?你得到了同样的错误。
你能做什么?
-
将缺失的主键值插入主表,或
-
删除违反约束的明细行,或
-
创建约束,但指示 Oracle 不检查现有行是否有效:
SQL> alter table research_metrics_pharma_aud 2 add constraint fk_rmpa_rtc 3 foreign key (media_company_id,source_id) 5 enable novalidate; Table altered. SQL>
enable novalidate
表示将为任何新行或修改行启用外键约束,但不会检查现有 行。如果该选项适合您,请使用它。但是,我相信前两个选项中的一个更好,第一个 - 添加缺少的主键 - 是最好的。