您好我有一个包含大量列的数据库,我想插入几条记录进行测试,现在为了在该数据库中插入一些东西,我必须编写大型查询..是否有可能做这样的事情
INSERT INTO table (SELECT FROM table WHERE id='5')
..我尝试插入ID为5的行,但我认为这会产生问题,因为它会尝试复制一条记录,是否可以更改此ID 5来说1000然后我能够在不编写复杂查询的情况下插入数据,同时避免复制数据.. tnx
答案 0 :(得分:4)
在PL / SQL中你可以这样做:
declare
l_rec table%rowtype;
begin
select * into l_rec from table where id='5';
l_rec.id := 1000;
insert into table values l_rec;
end;
答案 1 :(得分:0)
对于没有默认值的每个列,或者您希望插入默认值以外的值,您需要提供显式名称和值。
如果要选择所有列并按原样插入,则只能使用隐式列表(*
)。
由于您要更改PRIMARY KEY
,因此需要枚举。
但是,您可以创建更新前触发器并更改此触发器中PRIMARY KEY
的值。
请注意,触发器无法引用表本身,因此您需要提供一些其他方法来获取唯一编号(如序列):
CREATE TRIGGER trg_mytable_bi BEFORE INSERT ON mytable FOR EACH ROW
BEGIN
:NEW.id := s_mytable.nextval;
END;
这样您就可以使用星号,但它总是会替换PRIMARY KEY
的值。
答案 2 :(得分:0)
如果您在表上有一个触发器来处理序列中的主键(:NEW.id = seq_sequence.NEXTVAL),那么您应该可以这样做:
INSERT INTO表 (SELECT columns_needed FROM table WHERE what)
这将允许您在一个地方添加许多行(数量受WHERE子句限制)。您需要选择表所需的列不为null或没有默认值。请注意任何独特的限制。
否则,您将查看PL / SQL或其他形式的脚本以插入多行。