【问题标题】:What is going on with this SQL PK/FK error?这个 SQL PK/FK 错误是怎么回事?
【发布时间】:2021-12-05 03:59:45
【问题描述】:

我的 SQL 代码有问题。我正在创建两个表,一个名为 Orders_For,另一个名为 Result。结果应该从 Orders_For 中提取“日期”和“时间”作为外键。这些来自 Orders_for 的外键也是 Result 的主键。有人可以帮我指出正确的方向吗?

我收到错误:

ORA-00955:名称已被现有对象使用
00955. 00000 - “名称已被现有对象使用”

这是给出这个和结果的代码:

代码(在图片中更容易理解):

--ORDERS_FOR(OrdersForDate, OrdersForTime, PhysicianID, TestNumber, TestName, PatientID)

CREATE TABLE ORDERS_FOR(
    
OrdersForDate VARCHAR(50),
    
OrdersForTime VARCHAR(50),
    
O_PhysicianID CHAR(5),
    
O_TestNumber CHAR(5),
    
O_TestName VARCHAR(45),
   
O_PatientID CHAR(10),
    

CONSTRAINT Orders_ForPK_ok PRIMARY KEY(OrdersForDate,OrdersForTime,O_PhysicianID,O_TestNumber,O_TestName,O_PatientID),
    CONSTRAINT Orders_ForFK FOREIGN KEY(O_PhysicianID)
        REFERENCES PHYSICIAN(PhysicianID),
    CONSTRAINT Orders_ForFK_tol FOREIGN KEY(O_TestNumber,O_TestName)
        REFERENCES TEST(TestNumber,TestName),
    --CONSTRAINT Orders_ForFK FOREIGN KEY(O_TestName)
      -- REFERENCES TEST(TestName),
    CONSTRAINT Orders_ForFK_toll FOREIGN KEY(O_PatientID)
        REFERENCES PATIENT(PatientID)
    );
        
--RESULT(Date, Time, Result)
CREATE TABLE RESULT(
   ResultDate VARCHAR(50),
   ResultTime VARCHAR(50),
   ResultGiven VARCHAR(100),
   CONSTRAINT ResultPK_o PRIMARY KEY(ResultDate,ResultTime),
   CONSTRAINT ResultFK_tol FOREIGN KEY(ResultDate,ResultTime)
        REFERENCES ORDERS_FOR(OrdersForDate,OrdersForTime)
  --CONSTRAINT ResultFK_n2 FOREIGN KEY(ResultTime)
       --REFERENCES ORDERS_FOR(OrdersForTime)
    );

这是脚本输出:

Table ORDERS_FOR created.

从第 86 行开始的错误命令 -
创建表结果(
结果日期 VARCHAR(50),
结果时间 VARCHAR(50),
结果给定 VARCHAR(100),
CONSTRAINT ResultPK_o PRIMARY KEY(ResultDate,ResultTime),
CONSTRAINT ResultFK_tol FOREIGN KEY(ResultDate,ResultTime)
参考 ORDERS_FOR(OrdersForDate,OrdersForTime)
--CONSTRAINT ResultFK_n2 FOREIGN KEY(ResultTime)
--REFERENCES ORDERS_FOR(OrdersForTime)
)

错误报告 -
ORA-02270: 此列列表没有匹配的唯一键或主键 02270. 00000 - “此列列表没有匹配的唯一键或主键”
*原因:CREATE/ALTER TABLE 语句中的 REFERENCES 子句给出了一个列列表,在被引用的表中没有匹配的唯一键或主键约束。
*操作:使用 ALL_CONS_COLUMNS 目录视图查找正确的列名

这些也附在图片中。

code

result

【问题讨论】:

  • 另外,我没有包含“TEST”表,因为我认为它与这个问题无关。但如果它有帮助,我会包括它。
  • 欢迎来到 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法突出显示它!
  • 错误描述中有什么不清楚的地方?以及为什么在稍后显示另一个错误时发布 ORA-00955?
  • 附带说明:您的数据类型不合适。为什么要拆分日期和时间并为此使用字符串?我建议改为order_datetime DATE。 (DATE 是 Oracle 对日期时间的不恰当名称。)顺便说一下,在 Oracle 中,您不应使用 VARCHAR,而应使用 VARCHAR2。并且永远不要使用CHAR,而是始终使用VARCHAR2。使用CHAR 可能非常困难并且容易出错,因为添加了空白,您在编写查询时必须注意这一点。 Oracle 自己建议不要使用它。

标签: sql database oracle key schema


【解决方案1】:

外键引用主(或唯一)键。 IE。对于子表中的一行,父表中恰好有 一个 相关行。

您想要(ResultDate, ResultTime) 上的外键。但这不是父表ORDERS_FOR 中的主键或唯一键。同一日期和时间可以有很多行,因为这两列只是主键的一部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多