ORA-00001唯一约束报错:员工技能多对多关联表主键设置问题咨询
问题解决方案
问题1:调整方案实现正常多对多关联
你需要做3处核心调整:
- 首先删除
SKILL表中错误的EmployeeID字段及对应的外键约束:当前SKILL表的设计把技能和员工绑定成了一对多关系,不符合多对多业务逻辑,技能表仅需存储技能本身的属性,不需要关联员工字段。 - 检查并删除
SKILLSET表上你误添加的YSKILLSETID唯一约束:这个约束是针对SkillID字段的单列唯一约束,是导致同一技能只能分配给一名员工的直接原因。 - 可选优化:为了避免后续出现同一个员工重复绑定同一个技能的脏数据,可以给
SKILLSET表添加EmployeeID + SkillID的联合唯一约束,更符合关联表的业务逻辑。
修正后的参考建表语句如下:
-- 员工表无需调整 CREATE TABLE EMPLOYEE ( EmployeeID NUMBER (5, 0) NOT NULL, -- 其他自定义字段 CONSTRAINT EMPLOYEE_PK PRIMARY KEY (EmployeeID) ); -- 修正后的技能表:删除员工关联相关内容 CREATE TABLE SKILL( SkillID NUMBER (5, 0) NOT NULL, Description VARCHAR2(30), CONSTRAINT SKILL_PK PRIMARY KEY (SkillID) ); -- 修正后的关联表 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), -- 可选联合唯一约束,避免重复关联 CONSTRAINT SKILLSET_UNIQUE_REL UNIQUE (EmployeeID, SkillID) );
问题2:同员工多技能插入不触发报错的原因
你当前误添加的YSKILLSETID是针对SkillID字段的单列唯一约束,仅限制同一个技能ID在SKILLSET表中只能出现一次。
当你给同一名员工插入多条不同技能的关联记录时,用到的SkillID都是不同的,自然不会触发单列唯一约束的校验;只有给不同员工分配同一个SkillID的技能时,才会因为SkillID重复触发唯一约束报错。
内容的提问来源于stack exchange,提问作者jbiz
相关产品推荐
相关产品推荐

