如何使用复合键加载表

时间:2012-12-13 17:05:12

标签: sql oracle oracle11g

我正在尝试使用SQL加载下表。在我的Ldirectory表中,我将SYLIDENTIFIER组合作为主键,我正在尝试运行此查询

insert into S_User.LDIRECTORY (SY,LIDENTIFIER,ONAME,TELNUMBER) 
select  2013,D.CODE, D.NAME, D_YEAR.PHONE_NUMBER       
from    WHS.D   WHS.D_YEAR   
where   WHS.D.D_KEY=WHS.D_YEAR.D_KEY

我收到的错误是:

SQL Error ORA-00001 unique constraint violated

Cause:    An UPDATE or INSERT statement attempted to insert a duplicate key.
           For Trusted Oracle configured in DBMS MAC mode, you may see
           this message if a duplicate entry exists at a different level.
Action:   Either remove the unique restriction or do not insert the key.

我该如何解决这个问题?我认为在插入过程中它将SY列视为主键本身,但我对该列只有一个相同的值。

1 个答案:

答案 0 :(得分:1)

错误消息应指明违反的唯一约束的名称。假设所讨论的约束是主键而不是在表上定义的其他唯一约束,并假设主键约束是在SYLIDENTIFIER的组合上定义的复合约束,如您所示,这意味着您的查询返回重复的行。

您正在运行的查询会为SY返回2013年的硬编码值。因此,如果结果中的任何两行D.CODE相同,则可能会违反约束。您确定您希望D.CODE在整个结果集中是唯一的吗?很难根据对象的名称进行猜测(不知道D可能代表什么,不知道为什么D_YEAR会有PHONE_NUMBER列等等,但我倾向于猜测D中的一行可能会映射到D_YEAR中的多行,在这种情况下,结果中会有多行具有相同的D.CODE值,从而违反约束。

如果您确信查询不应返回具有相同D.CODE值的任何两行,则可以使用DML错误日志记录将违反约束的行写入错误表,以便您可以分析问题