oracle 一个列可以被限制为使用一个或另一个外键作为条目吗?

egmofgnx  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(101)

我一直试图限制一个列接受一个只能是外键A条目外键B条目的条目,但我不确定这是否可能?
对于上下文,我正在创建一个帮助台数据库,其中包含一个名为ticket的表,其中包含一个“resolved_by”列,我希望只接受“analyst_id”或“specialist_id”的值,这些值中的每一个分别是表“analyst”和“specialist”的主键。
我已经向列中添加了单独的约束,将每个键指定为唯一接受的输入,但在尝试向表中添加新记录时,收到错误“integrity constraint(S21005182.SYS_C00234833)violated - parent key not found”。

CREATE TABLE TICKET(
    Id_Caller               CHAR(6)       REFERENCES Caller (Id_Caller),
    Id_Ticket               CHAR(6)       PRIMARY KEY,
    Problem_Description     VARCHAR2(500) NOT NULL,
    Id_General_Problem      CHAR(6)       REFERENCES General_Problem_Types(Id_General_Problem),
    Id_Specific_Problem     CHAR(6)       REFERENCES Specific_Problem_Types(Id_Specific_Problem),
    OPENDED_DATE_TIME       DATE          DEFAULT SYSDATE NOT NULL,
    Opened_By               CHAR(6)       NOT NULL,
    Assigned_To             CHAR(6)       NOT NULL,
    RESOLVED_By             CHAR(6),
    RESOLVED_DATE_TIME      DATE,
    TIME_TAKEN_TO_RESOLVE   NUMBER(5,0),
    RESOLUTION_DESCRIPTION  VARCHAR2(500)
);

ALTER TABLE TICKET 
ADD FOREIGN KEY (resolved_by) REFERENCES Specialist (ID_SPEACIALIST);

ALTER TABLE TICKET 
ADD FOREIGN KEY (resolved_by) REFERENCES Analyst (Id_Analyst);

INSERT INTO ticket
VALUES(0, ticket_IDS.nextval, 'Cracked Screen', 500020, 600000,'11-MAY-2020' ,100000, 200000, 200000, '19-MAY-2020',90,'replaced screen' );

我相信这意味着条目被拒绝,因为其中一个外键不存在于条目中(但另一个是),即条目是外键b值,但不是外键A。
所以目前我的代码拒绝了不是外键B和外键A的条目?

kupeojn6

kupeojn61#

最有可能的是,您应该将SPECIALISTANALYST合并到一个表中,并使用类型列来区分它们。然后,您有一个TICKET外键可以引用的PK约束。
如果它们之间存在大量的属性差异,使得将它们作为单独的属性是有意义的,那么您需要一个超类型-子类型关系,其中一个公共实体(PERSON)覆盖两个子类型SPECIALISTANALYST的共享属性。然后,您将对其建模:

TICKET -> PERSON <- ANALYST
                 <- SPECIALIST

在此模型中,PERSON将掌握PERSON_ID主键,并有一个类型指示符指定它属于哪个子类型(以知道要联接到什么子类型表),并且具有分析师和Maven两者共有的任何其他属性,而ANALYSTSPECIALIST将每个PERSON_ID键(都作为PK * 和 * FK到PERSON,以强制1:1关系)和特定于子类型的任何属性。同样,您可以让TICKET外键引用PERSON,一个单一的超类型实体。
最后,如果您的问题有可能由两个人解决,一个分析师和一个Maven,那么您需要在TICKET表中有两个单独的列,每个列上有单独的FK。但是,如果它可以由两个以上或两个相同角色的人来解决,或者您的角色可能在未来发生变化,那么您最好使用多对多桥接表TICKET_RESOLVERS,以便您可以根据需要关联尽可能多的解析器。在任何情况下,该桥接表都将指向统一类型或超类型PERSON

相关问题