主键唯一约束混淆/解决方案
Posted
技术标签:
【中文标题】主键唯一约束混淆/解决方案【英文标题】:Primary Key Unique Constraint confusion / solution 【发布时间】:2021-07-16 13:46:54 【问题描述】:我有一个包含员工、技能表和技能组表的数据库:
CREATE TABLE EMPLOYEE (
EmployeeID NUMBER (5, 0) NOT NULL,
*.....other fields*
CONSTRAINT EMPLOYEE_PK PRIMARY KEY (EmployeeID));
CREATE TABLE SKILL(
SkillID NUMBER (5, 0) NOT NULL,
Description VARCHAR2(30),
CONSTRAINT SKILL_PK PRIMARY KEY (SkillID),
CONSTRAINT SKILL_FK FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEE(EmployeeID));
CREATE TABLE SKILLSET(
SkillSetID NUMBER (5,0) NOT NULL,
EmployeeID NUMBER (5,0) NOT NULL,
SkillID NUMBER (5,0) NOT NULL,
CONSTRAINT SKILLSET_PK PRIMARY KEY (SkillSetID)
CONSTRAINT SKILLSET_SKILL_FK FOREIGN KEY (SkillID) REFERENCES Skill(SkillID));
CONSTRAINT SKILLSET_EMP_FK FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEE(EmployeeID));
我的员工可以拥有多种技能,这存储在技能表中。 当我尝试为多个员工分配技能表中的技能时,我收到 ORA-00001:违反唯一约束 (YSKILLSETID)。
这对我来说很有意义,我仍在寻找一种解决方案,让多名员工拥有多种技能。
但是,我的困惑在于,一名员工可以拥有多种技能,难道不应该受到唯一约束的约束吗?
INSERT INTO SKILLSET VALUES (125, 31150, 2513);
INSERT INTO SKILLSET VALUES (124, 31150, 2523);
INSERT INTO SKILLSET VALUES (122, 31150, 8493);
INSERT INTO SKILLSET VALUES (121, 31153, 2141);
INSERT INTO SKILLSET VALUES (120, 31154, 2521);
INSERT INTO SKILLSET VALUES (119, 31154, 2141);
INSERT INTO SKILLSET VALUES (118, 31150, 2521);
screenshot of test
我的问题:
我可以做些什么来让许多员工掌握多种技能? 为什么这适用于一名拥有多种技能的员工?【问题讨论】:
模型本身很奇怪:您有一个员工作为技能的属性,并尝试创建另一个表,其中包含一些表示相同关系的附加列。EmployeeID
应该从 skill
表中删除。您提供的语句不会返回此错误,因为没有重复的SkillSetID
值
我已经编辑了技能表,这是一个错误,它不应该有员工 ID。
对 SKILLSET 的唯一唯一约束是 SKILLSET_PK PRIMARY KEY (SkillSetID)
并且所有 SkillSetID 都是唯一的,所以我看不到你有这个错误。什么是 YSKILLSETID?
【参考方案1】:
我认为清楚地表述问题域会有所帮助。我认为:
系统有很多员工。 该系统有许多技能。 员工可能拥有零个或多个技能。 一项技能属于零个或多个员工。
如果是这样,您有以下表格:
Employee
----
ID (pk)
...
Skill
----
ID (pk)
Description
...
Employee_skill
--------------
employee_id (fk)
skill_id (fk)
....
【讨论】:
是的,这是我目前的表结构,但是我仍然收到唯一约束的错误。 是的,这就是我目前的表格结构 那么,我们正在向一个移动的目标射击,因为这不是你的问题所显示的。不幸的是,SO 平台只允许在原始问题或答案中使用结构化、格式化的代码,因此很难在不丢失上下文的情况下修改问题。也就是说,请阅读***.com/help/minimal-reproducible-example 我不确定最终会发生什么,一旦我第二天重新启动 Oracle,我的模型似乎工作正常。也许我只是做错了什么,这是我模型的最终结构:***.com/a/68410677/16463270以上是关于主键唯一约束混淆/解决方案的主要内容,如果未能解决你的问题,请参考以下文章