如何在主键约束下的两列上创建外键?

How do I create a foreign key on two columns that are under the primary key constraint?

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, 
    "SOURCE_ID" NUMBER(2,0) 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: parent keys not found

我是否需要创建组合列: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 将在 table 创建的同时创建一个主键约束和唯一索引来支持它
  • 因为我使用的是 11gXE 并且它不支持标识列,所以我删除了它 从第二个 table;我必须通过触发器强制执行它。您无需为此做任何事情,只需说(这样您就不会想知道 它去了哪里?

您遇到的错误:

ORA-02298: parent keys not found

表示在第二个 table 中有 (media_company_id, source_id) 的组合 不存在 作为对 (cid, source_id)在第一个 table。举例说明:

先去掉外键约束(否则我做不到):

SQL> alter table research_metrics_pharma_aud drop constraint fk_rmpa_rtc;

Table altered.

在第一个(master)中插入一行table:

SQL> insert into research_tv_company (cid, source_id) values (1, 1);

1 row created.

在第二行中插入两行(详细信息)table;第一个组合有效,第二个组合无效,因为 research_tv_company:

中不存在 (2, 2)
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, source_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)
  4    references research_tv_company (cid, source_id);
  add constraint fk_rmpa_rtc
                 *
ERROR at line 2:
ORA-02298: cannot validate (SCOTT.FK_RMPA_RTC) - parent keys not found


SQL>

看到了吗?你得到了同样的错误。

你能做什么?

  • 将缺少的主键值插入主控 table,或

  • 删除违反约束的明细行,或

  • 创建约束,但指示 Oracle 检查现有行是否有效:

    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)
      5    enable novalidate;
    
    Table altered.
    
    SQL>
    

    enable novalidate 表示将为任何新的或修改的行启用外键约束,但不会检查 现有的 行。如果该选项适合您,请使用它。但是,我认为前两个选项中的一个更好,第一个 - 添加缺少的主键 - 是最好的。