我一直试图限制一个列接受一个只能是外键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的条目?
1条答案
按热度按时间kupeojn61#
最有可能的是,您应该将
SPECIALIST
和ANALYST
合并到一个表中,并使用类型列来区分它们。然后,您有一个TICKET
外键可以引用的PK约束。如果它们之间存在大量的属性差异,使得将它们作为单独的属性是有意义的,那么您需要一个超类型-子类型关系,其中一个公共实体(
PERSON
)覆盖两个子类型SPECIALIST
和ANALYST
的共享属性。然后,您将对其建模:在此模型中,
PERSON
将掌握PERSON_ID
主键,并有一个类型指示符指定它属于哪个子类型(以知道要联接到什么子类型表),并且具有分析师和Maven两者共有的任何其他属性,而ANALYST
和SPECIALIST
将每个PERSON_ID
键(都作为PK * 和 * FK到PERSON
,以强制1:1关系)和特定于子类型的任何属性。同样,您可以让TICKET外键引用PERSON,一个单一的超类型实体。最后,如果您的问题有可能由两个人解决,一个分析师和一个Maven,那么您需要在
TICKET
表中有两个单独的列,每个列上有单独的FK。但是,如果它可以由两个以上或两个相同角色的人来解决,或者您的角色可能在未来发生变化,那么您最好使用多对多桥接表TICKET_RESOLVERS
,以便您可以根据需要关联尽可能多的解析器。在任何情况下,该桥接表都将指向统一类型或超类型PERSON
。