oracle中外键的外键[关闭]

Posted

技术标签:

【中文标题】oracle中外键的外键[关闭]【英文标题】:Foreign key of Foreign key in oracle [closed] 【发布时间】:2021-02-23 05:10:56 【问题描述】:

我正在尝试创建 3 个表并在创建第三个表 EMPLOYEE_VALUES 时,我收到一条错误消息,指出此列列表没有匹配的唯一键或主键。我已经浏览过相同的堆栈溢出帖子并尝试了不同的方法,但无法弄清楚是什么导致了这个问题。感谢是否有人可以对此有所了解

CREATE TABLE P_EMPLOYEE_TYPE (
    ID NUMBER(22) NOT NULL,
    NAME VARCHAR2(50) NOT NULL,    
    PRIMARY KEY (ID)    
);


CREATE TABLE P_EMPLOYEE(
    P_ID NUMBER NOT NULL,
    EMPLOYEE_TYPE_ID  NUMBER NOT NULL,
    FOREIGN KEY (P_ID) REFERENCES P(ID),
    FOREIGN KEY (EMPLOYEE_TYPE_ID) REFERENCES P_EMPLOYEE_TYPE(ID),
    PRIMARY KEY(P_ID,EMPLOYEE_TYPE_ID)
    );

-- The following table is causing the issue 

CREATE TABLE EMPLOYEE_VALUES(
    ID NUMBER(4) NOT NULL,
    P_ID NUMBER,
    EMPLOYEE_TYPE_ID  NUMBER,
    VALUE VARCHAR2(100),
    PRIMARY KEY(ID,P_ID,EMPLOYEE_TYPE_ID),
    FOREIGN KEY (P_ID,EMPLOYEE_TYPE_ID) REFERENCES P_EMPLOYEE(P_ID,EMPLOYEE_TYPE_ID)
    );

【问题讨论】:

声明 P_ID,EMPLOYEE_TYPR_ID 为主键。只需在声明后加上 PRIMARY KEY 【参考方案1】:

你错了; employee_values 不会失败,但 p_employee does 因为它引用了不存在的 p 表。这个:

SQL> -- This table is missing
SQL>
SQL> CREATE TABLE p
  2  (
  3     id   NUMBER CONSTRAINT pk_p PRIMARY KEY
  4  );

Table created.

现在,剩下的表格。

无需在主键约束列中指定NOT NULL;他们不可能是NULL 一个好的做法是您应该命名您的约束,否则它们的名称是由 Oracle 生成的,并且很难在其他约束中找到

所以:

SQL> CREATE TABLE P_EMPLOYEE_TYPE
  2  (
  3     ID     NUMBER (22) CONSTRAINT pk_emptyp PRIMARY KEY,
  4     NAME   VARCHAR2 (50) NOT NULL
  5  );

Table created.

SQL> CREATE TABLE P_EMPLOYEE
  2  (
  3     P_ID               NUMBER,
  4     EMPLOYEE_TYPE_ID   NUMBER,
  5     --
  6     CONSTRAINT fk_empl_p FOREIGN KEY (P_ID) REFERENCES P (ID),
  7     CONSTRAINT fk_empl_emptyp FOREIGN KEY (EMPLOYEE_TYPE_ID)
  8        REFERENCES P_EMPLOYEE_TYPE (ID),
  9     CONSTRAINT pk_empl PRIMARY KEY (P_ID, EMPLOYEE_TYPE_ID)
 10  );

Table created.

SQL> CREATE TABLE EMPLOYEE_VALUES
  2  (
  3     ID                 NUMBER (4),
  4     P_ID               NUMBER,
  5     EMPLOYEE_TYPE_ID   NUMBER,
  6     VALUE              VARCHAR2 (100),
  7     --
  8     CONSTRAINT pk_empval PRIMARY KEY (ID, P_ID, EMPLOYEE_TYPE_ID),
  9     CONSTRAINT fk_empval_emp FOREIGN KEY (P_ID, EMPLOYEE_TYPE_ID)
 10        REFERENCES P_EMPLOYEE (P_ID, EMPLOYEE_TYPE_ID)
 11  );

Table created.

【讨论】:

非常感谢。这真的很有帮助。我已经在那里有 Product 表,问题是,正如您指定我的查询中有一个非空关键字。我现在可以创建表格了。再次感谢。

以上是关于oracle中外键的外键[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

sql中外键怎么写?

数据库中外键名可以随便起吗

Mysql中外键的 Cascade ,NO ACTION ,Restrict ,SET NULL

mysql中主键和外键的名称能否相同?比如,表aaa中主键aid,表bbb中外键是aid(指向表aaa),这样可以吗?

Oracle一个字段的的外键可以当另一个字段的主键吗

Oracle如何创建一个置空的外键约束?