【问题标题】:Update violates primary key更新违反主键
【发布时间】:2016-01-02 12:08:50
【问题描述】:

更新到数据库时我的更新收到以下错误:

ORA-00001:违反了唯一约束 (DONALDBURY.BARS_ID_PK)

我正在使用以下代码作为我的更新。我不想摆脱约束,而是想找到一种解决方法。我想停止设置重复值。

MERGE INTO bars DEST_TABLE
USING (select :P3_filename as filename from dual) SOURCE_TABLE
ON (DEST_TABLE.name = SOURCE_TABLE.filename)
WHEN MATCHED THEN 
 UPDATE SET  image = ORDSYS.ORDImage()
WHEN NOT MATCHED THEN 
INSERT (
      image_id,
      filename,
      image,
      name,
      address,
      postcode,
      description)
      VALUES (:P3_image_id,
     :P3_filename,
      ORDSYS.ORDImage(),
     :P3_NAME,
     :P3_ADDRESS,
     :P3_POSTCODE,
     :P3_DESCRIPTION);

【问题讨论】:

  • 你能添加DEST_TABLE的结构和可用的约束吗
  • @VR46 你能解释一下吗?
  • 对不起,我的意思是bars 表结构
  • 请运行此查询:select table_name, column_name, position from user_cons_columns where constraint_name = 'BARS_ID_PK'; 并将此查询的结果附加到问题中。
  • @kordirko 查看上面的消息 ^

标签: sql oracle plsql sql-merge


【解决方案1】:

image_id 列上有一个名为 BARS_ID_PK 的唯一约束 - 此约束禁止多行在此列中具有相同的值。

您正在尝试使用表中已存在的 image_id 插入新行。

为避免此错误,只需在查询中为 :P3_image_id 占位符分配一个表中尚不存在的值。

【讨论】:

    【解决方案2】:

    根据提供的信息,DEST 表上有一个基于 IMAGE_ID 的主键,因此不允许重复的 IMAGE_ID。 MERGE 语句根据文件名 (DEST_TABLE.filename) 检查是否存在记录。您需要检查 image_id(或文件名和 image_id)。根据提供的信息,您的 bar 表中似乎可能有多个具有相同文件名的 image_id。

    【讨论】:

      【解决方案3】:

      作为一种解决方法...我相信图像 ID 是一个数字列。从表中找出最大图像 ID。在插入表格时添加 MaxImageID+1...此值将始终是唯一的,希望能解决您的问题.. 干杯..!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 2012-07-15
        • 1970-01-01
        相关资源
        最近更新 更多