Oracle中的唯一约束。它是如何工作的?

时间:2015-10-17 21:58:14

标签: sql oracle sql-update

我刚刚将一个新列manager_id添加到了一个unique constraint的现有表中。我使用此语法填充manager_id列:

update employees
set manager_id = &id
where job_id = '& job';

当我运行此代码时,我收到一条错误消息:

  

ORA-00001:违反了唯一约束(HR.MAN_UK)

此列为空,那么我怎么可能违反约束?

2 个答案:

答案 0 :(得分:0)

如果employees有多个匹配job_id = '& id'的行,则可以违反约束。也就是说,您在语句中将多行设置为相同的ID。

冲突与现有价值无关。它们位于您在update中设置的值集合中。

答案 1 :(得分:0)

  

"对于我试过的第一个,只有一行"

这似乎不太可能,当我们尝试用第二个相同的列填充约束列时,Oracle只会抛出一个唯一的约束违规。因此,如果在运行更新之前MANAGER_ID列为空,则JOB_ID必须击中多行。

  

"有些会返回多行"

如果业务逻辑是管理者可以管理多个人 - 让我们面对它是常态 - 那么就不应该对Manager ID有唯一的约束。所以放弃它。

你应该拥有的是一个外键,要么是引用EMPLOYEES主要的(经理必须是雇员),要么是,如果你有,那么是经理人表(经理必须是经理)。