主键唯一约束混淆/解决方案

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

以上是关于主键唯一约束混淆/解决方案的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的唯一约束

在导入Oracle数据库的时候违反唯一约束条件是为啥?要怎么解决?

具有序列提供的 id 的主键列上的唯一约束违规

ORA-00001: 违反唯一约束条件

实体框架代码中的唯一约束

SQLServer主键和唯一约束的区别