我刚刚将一个新列manager_id
添加到了一个unique constraint
的现有表中。我使用此语法填充manager_id
列:
update employees
set manager_id = &id
where job_id = '& job';
当我运行此代码时,我收到一条错误消息:
ORA-00001:违反了唯一约束(HR.MAN_UK)
此列为空,那么我怎么可能违反约束?
答案 0 :(得分:0)
如果employees
有多个匹配job_id = '& id'
的行,则可以违反约束。也就是说,您在语句中将多行设置为相同的ID。
冲突与现有价值无关。它们位于您在update
中设置的值集合中。
答案 1 :(得分:0)
"对于我试过的第一个,只有一行"
这似乎不太可能,当我们尝试用第二个相同的列填充约束列时,Oracle只会抛出一个唯一的约束违规。因此,如果在运行更新之前MANAGER_ID列为空,则JOB_ID必须击中多行。
"有些会返回多行"
如果业务逻辑是管理者可以管理多个人 - 让我们面对它是常态 - 那么就不应该对Manager ID有唯一的约束。所以放弃它。
你应该拥有的是一个外键,要么是引用EMPLOYEES主要的(经理必须是雇员),要么是,如果你有,那么是经理人表(经理必须是经理)。