根据现有行将行插入SQL表

时间:2013-11-20 00:08:54

标签: sql oracle

我需要在Oracle中向表中添加一个新行。问题是该表有50列,我真的不想为INSERT语句全部写出来。我尝试执行SELECT INTO语句来复制行,然后单独更改我关心的字段,但这会导致主键上出现UNIQUE冲突。所以我真正想做的是声明一个变量,它包含一行而不用命名所有列,更改主键字段,然后插入该变量。怎么办?

2 个答案:

答案 0 :(得分:2)

您可以在匿名PL / SQL块中使用%ROWTYPE来声明表示表中行的记录,然后在该记录中选择一行并更改主键并插入更新的记录。您甚至可以将其重复用于多个插入:

DECLARE
  rec SOME_TABLE%ROWTYPE;
BEGIN
  SELECT *
  INTO   rec
  FROM   SOME_TABLE
  WHERE  A = 1; -- Primary Key

  rec.A := 2; -- Change the primary key value.
  INSERT INTO SOME_TABLE VALUES rec;

  rec.A := 3; -- Change the primary key again.
  INSERT INTO SOME_TABLE VALUES rec;

  FOR i IN 4 .. 9 LOOP
    rec.A := i; -- Change it repeatedly...
    INSERT INTO SOME_TABLE VALUES rec;
  END LOOP;

  FOR i IN 1 .. 3 LOOP
    rec.A := SOME_SEQUENCE.NEXTVAL; -- Or you can manage the primary key's value using a sequence.
    INSERT INTO SOME_TABLE VALUES rec;
  END LOOP;
END;
/

SQLFIDDLE

答案 1 :(得分:0)

我经常想做类似的事情,但在我所知道的任何SQL变体中都是不可能的。如果没有明确地命名它们(或者可能事先在它们上定义一个视图),你不能只要求表中的某些列。

我可以建议的唯一捷径是将列名列表转储到方便的位置,然后将其复制到insert语句中,只更改所需的值:

insert into foo (select 'newC1' as c1, c2, c3, c4, ..., c50 from foo where bar='baz');

:: edit ::事实上,我经常这样做,因此我编写了一个Python脚本来帮助我。我告诉它我正在编辑哪个表,一些where子句恰好匹配1行,我想要更改的列列表,以及我想要在这些列中的新值列表。然后它完成其余的工作。