SQL错误:ORA-01779:无法修改映射到非密钥保留表的列

时间:2014-01-17 14:02:05

标签: sql oracle10g sql-update

我正在尝试使用另一个表中的数据更新表。 数据是为了保持简单而编写的

PROJECT (表格)

ID   FK_INCIDENT-ID  DAYS
---------------------------
01   10              0
02   20              0

INCIDENT (表格)

ID  FK_PRIORITY-ID
------------------
10  100
20  200

优先级(表格)

ID   DAYS
---------
100  1
200  2

我需要做的是将DAYS从PRIORITY复制到PROJECT中的DAYS,并将它们绑定在一起。

更新到PROJECT表后,它应该是这样的

ID   FK_INCIDENT-ID   DAYS
---------------------------
01   10               1
02   20               2

PROJECT与PRIORITY的唯一关系是通过INCIDENT。

FK_INCIDENT-ID(在PROJECT中)到FK_PRIORITY-ID(在INCIDENT中)到ID(在PRIORITY中)

update (select i.ID, pro.Days, pri.Days AS Days2
from incident i
left join project pro on (i.id = pro.FK_Incident-id)
left join priority pri on (i.Fk_priority-id = pri.id)
where pro.days = 0) t
set t.Days = t.Days2

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

在我看来,查询中的第一个连接无效:我认为,你应该用(i.id = pro.FK_INCIDENT-ID)替换(i.FK_Incident-id = pro.id)。

此外,here is nice explanation on the topic of key-preserved tables

答案 1 :(得分:0)

你似乎是以错误的顺序加入你的桌子,因为你所描述的关系;你说:

  

FK_INCIDENT-ID(在PROJECT中)到FK_PRIORITY-ID(在INCIDENT中)到ID(在PRIORITY中)

但您要加入INCIDENT加入PROJECT加注PRIORITY

这就是你收到错误的原因。您的架构中没有任何东西可以阻止事件映射到多个项目,左外连接意味着同一事件可以多次出现,即使它没有,如果它只出现一次,那么您不一定知道如何回到正确的记录进行更新。

如果您重新订购内联视图查询以将PROJECT加入INCIDENTPRIORITY,那么它可以正常运行(使用有效名称):

update (
  select i.ID, pro.Days, pri.Days AS Days2
  from project pro
  left join incident i on (i.id = pro.incident_id)
  left join priority pri on (pri.id = i.priority_id)
  where pro.days = 0) t
set t.Days = t.Days2;

SQL Fiddle

为什么days值完全归一化到project表中呢?或者它是否意味着其他东西(比如实际的解决时间,而不是来自优先级的目标),而你只是假设没有设置它的项目最差?虽然这似乎在incident水平更合适,但我想。或者,这当然可以弥补......