我需要在Oracle中向表中添加一个新行。问题是该表有50列,我真的不想为INSERT语句全部写出来。我尝试执行SELECT INTO语句来复制行,然后单独更改我关心的字段,但这会导致主键上出现UNIQUE冲突。所以我真正想做的是声明一个变量,它包含一行而不用命名所有列,更改主键字段,然后插入该变量。怎么办?
答案 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;
/
答案 1 :(得分:0)
我经常想做类似的事情,但在我所知道的任何SQL变体中都是不可能的。如果没有明确地命名它们(或者可能事先在它们上定义一个视图),你不能只要求表中的某些列。
我可以建议的唯一捷径是将列名列表转储到方便的位置,然后将其复制到insert语句中,只更改所需的值:
insert into foo (select 'newC1' as c1, c2, c3, c4, ..., c50 from foo where bar='baz');
:: edit ::事实上,我经常这样做,因此我编写了一个Python脚本来帮助我。我告诉它我正在编辑哪个表,一些where
子句恰好匹配1行,我想要更改的列列表,以及我想要在这些列中的新值列表。然后它完成其余的工作。