不插入新记录

时间:2012-04-03 22:23:50

标签: sql oracle plsql

我有一个名为“报告”的表格,其中包含报告ID及其各自的扩展代码。目前,作为示例,每个ID的唯一扩展是“TXT”。我正在尝试在每个现有报告ID中插入新扩展名('RTF')。这是我的代码:

merge into report a
      using (select x.rpt_id as value1, 'RTF' as value2
             from report x
             where x.extension <> 'RTF') b
      on (a.rpt_id = b.value1)
when not matched then
      insert values (b.value1, b.value2);

我没有错误,但没有插入任何内容......

1 个答案:

答案 0 :(得分:2)

在运行语句(当然只是一个示例)和运行语句后所需的数据之前发布数据样本会很有帮助。

听起来你正在寻找像

这样的东西
INSERT INTO report( rpt_id, extension )
  SELECT rpt_id, 'RTF'
    FROM report
   WHERE extension != 'RTF'

如果主键实际上是rpt_idextension组合的复合约束,那么您的目标是将N个报表的表格分别扩展为TXT和使用相同的rpt_id和扩展名为“RTF”创建N个新行,这将起作用。

SQL> create table report(
  2    rpt_id number,
  3    extension varchar2(3),
  4    constraint extension_pk primary key( rpt_id, extension )
  5  );

Table created.

SQL> insert into report values( 1, 'TXT' );

1 row created.

SQL> insert into report values( 2, 'TXT' );

1 row created.

SQL> insert into report values( 3, 'TXT' );

1 row created.

SQL> insert into report values( 4, 'TXT' );

1 row created.

SQL> insert into report values( 5, 'TXT' );

1 row created.

SQL> select * from report;

    RPT_ID EXT
---------- ---
         1 TXT
         2 TXT
         3 TXT
         4 TXT
         5 TXT

SQL> insert into report( rpt_id, extension )
  2    select rpt_id, 'RTF'
  3      from report
  4     where extension != 'RTF';

5 rows created.

SQL> select * from report;

    RPT_ID EXT
---------- ---
         1 RTF
         1 TXT
         2 RTF
         2 TXT
         3 RTF
         3 TXT
         4 RTF
         4 TXT
         5 RTF
         5 TXT

10 rows selected.

根据您所获得的错误,肯定会出现主要密钥未在rpt_idextension的组合上定义。

相关问题