oracle SQL中同一个外键如何有多个引用?

wtzytmuj  于 2023-10-16  发布在  Oracle
关注(0)|答案(3)|浏览(121)

我试图把关系表示到SQL,但我得到以下错误(我的SQL然后错误)

CREATE TABLE REQUISITION
(REQNO CHAR(6) CONSTRAINT REQNO_PK PRIMARY KEY,
STAFFNO REFERENCES STAFF_CHARGENURSE(STAFFNO),
STAFFNAME REFERENCES SUPPLIES_PHARMACEUTICAL(STAFFNAME),
STAFFNAME REFERENCES SUPPLIES_SURGICAL(STAFFNAME),
STAFFNAME REFERENCES SUPPLIES_NON-SURGICAL(STAFFNAME),
WARDNO CHAR(6),
ITEMNO CHAR(6),
QUANTITY INT,
DATEORDERED DATE,
DATERECIEVED DATE);
STAFFNAME REFERENCES SUPPLIES_SURGICAL(STAFFNAME),
*
ERROR at line 5: 
ORA-00957: duplicate column name

如何在SQL中输入多个外键?所有itemNo都指向MANDATORY或关系中的超类,这就是为什么它们是itemNo的3个示例作为外键。相关:

Requisition(reqNo, staffNo, staffName, wardNo, itemNo, quantity, dateOrdered, dateRecieved)
    Primary Key reqNo
    Foreign Key staffNo references Staff_ChargeNurse(staffNo)
    Foreign Key itemNo references Supplies_Pharmaceutical(itemNo)
    Foreign Key itemNo references Supplies_Surgical(itemNo)
    Foreign Key itemNo references Supplies_Non-Surgical(itemNo)
fxnxkyjh

fxnxkyjh1#

您可以使用显式CONSTRAINT语法:

CREATE TABLE REQUISITION(
    REQNO CHAR(6) CONSTRAINT REQNO_PK PRIMARY KEY,
    STAFFNO REFERENCES STAFF_CHARGENURSE(STAFFNO),
    STAFFNAME data_type,
    WARDNO CHAR(6),
    ITEMNO CHAR(6),
    QUANTITY INT,
    DATEORDERED DATE,
    DATERECIEVED DATE,
    CONSTRAINT FK_1 FOREIGN KEY (ItemNo) 
         REFERENCES SUPPLIES_PHARMACEUTICAL(ItemNo), 
    CONSTRAINT FK_2 FOREIGN KEY (ItemNo)  
         REFERENCES SUPPLIES_SURGICAL(ItemNo),
    CONSTRAINT FK_3 FOREIGN KEY (ItemNo) 
         REFERENCES SUPPLIES_NON_SURGICAL(ItemNo)
);
vsmadaxz

vsmadaxz2#

您需要在itemno上有三个约束,而不是三个itemno列:

create table requisition
( reqno         varchar2(6) constraint reqno_pk primary key
, staffno       references staff_chargenurse(staffno)
, staffname     varchar2(20)
, wardno        varchar2(6)
, itemno        constraint fk_1 references supplies_pharmaceutical(itemno)
                constraint fk_2 references supplies_surgical(itemno)
                constraint fk_3 references supplies_nonsurgical(itemno)
, quantity      int
, dateordered   date
, daterecieved  date );

您可以为约束命名,也可以让系统来命名。在上面的示例中,staffno上的FK在我的数据库中被命名为SYS_C0018431。像这样的随机名称可以创建额外的工作进一步下线。
编辑:注意到你在这个例子中使用了STAFFNAME,在这种情况下(假设三个SUPPLIES_ tables在STAFFNAME上有一个主键或唯一键):

create table requisition
( reqno         varchar2(6) constraint reqno_pk primary key
, staffno       references staff_chargenurse(staffno)
, staffname     constraint rs1 references supplies_pharmaceutical(staffname)
                constraint rs2 references supplies_surgical(staffname)
                constraint rs3 references supplies_nonsurgical(staffname)
, wardno        varchar2(6)
, itemno        varchar2(6)
, quantity      int
, dateordered   date
, daterecieved  date );

您也可以在表级别或作为单独的语句来定义它们,但这样它们就不能继承(第一个)父类的数据类型。
所有itemNo都指向MANDATORY, OR关系中的超类,这就是为什么它们是itemNo的3个示例作为外键。
我以前没有听说过“强制或”关系,我不认为这是一个标准的数据建模术语。这可能是你正在使用的工具。
这里没有超类,它们也不是任何东西的示例。您正在定义引用三个单独数据库表的三个外键约束。外键约束是一个规则,规定指定列的所有值必须存在于指定的父表中。

mrwjdhj3

mrwjdhj33#

实现所述内容的一种解决方案是使用独立于数据记录的记录键。我们为每个记录使用一个索引。对多个表中的一个表的外键约束是通过保持一个对其进行外键约束的“键”表来实现的。表中的每个记录都包含一个唯一的键,该键必须存在于键表中,可能还伴随有一个代码来指示拥有表。定义其他表中项之间关系的外键将引用来自多个表中任何一个表的键时,引用键表。定义关系的表中的每个记录在键表中也有自己的键。我们有一个参数化的存储过程来插入记录,如果提交的记录中不存在新的键值,则该记录将获得新的键值。在键表中插入新键,然后在相应的表中插入新记录。现有的键将导致插入异常(应该是更新)。
请注意,在给定的情况下,问题是设计。一种方法是使用一个单独的供应表,用一个代码定义供应项目的性质。对供应项目的任何引用都是一个表的外键。类别可以通过定义一个视图来“查看”,该视图选择具有给定类别代码或代码的项目。
同样,也可以使用一张人事表。
采购会计也遇到同样的问题。有些购买是通过“订单”,有些是“直接”(或立即)。一个人必须能够跟踪订单。解决方案是定义一个带有“类别”代码(例如,“O”或“P”)约束的采购表。然后定义表格,以包含任何特定于订单(例如,供应商订单号)或直接采购(例如,收据图像文件)的数据,引用采购记录。

相关问题