2009-10-19 153 views
2

嗨我有一个数据库加载的列,我想插入几个记录进行测试,现在为了插入到该数据库的东西我不得不写大查询..是否有可能做这样的事情插入到oracle数据库

INSERT INTO table (SELECT FROM table WHERE id='5') ..我尝试插入ID为5的行,但我认为这会产生一个问题,因为它会尝试复制一条记录,是否有可能改变这个ID 5让它说1000然后我可以在不写数据的情况下插入数据,同时避免复制数据。tnx

回答

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; 
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的值。

0

如果您对表的触发器来处理从序列的主键(:NEW.id = seq_sequence.NEXTVAL),那么你应该能够做到:

INSERT INTO表 (选择columns_needed FROM表WHERE)

这将允许您在一个行中添加多行(该数量受WHERE子句限制)。您需要选择表所需的列不为空或不具有默认值。谨防任何独特的限制。

否则你会看PL/SQL或其他形式的脚本来插入多行。