【问题标题】:Insert into oracle database插入oracle数据库
【发布时间】:2009-10-19 20:59:41
【问题描述】:

您好,我有一个包含大量列的数据库,我想插入几条记录进行测试,现在为了向该数据库中插入一些内容,我必须编写大型查询.. 是否可以做这样的事情

INSERT INTO table (SELECT FROM table WHERE id='5') .. 我尝试插入 ID 为 5 的行,但我认为这会产生问题,因为它会尝试复制记录,是否可以将此 ID 5 更改为 1000,然后我会能够在不编写复杂查询的情况下插入数据,同时避免数据复制.. tnx

【问题讨论】:

    标签: oracle oracle10g


    【解决方案1】:

    在 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;
    

    【讨论】:

      【解决方案2】:

      如果您在表上有一个触发器来处理序列中的主键 (:NEW.id = seq_sequence.NEXTVAL),那么您应该可以这样做:

      插入表格 (SELECT columns_needed FROM table WHERE)

      这将允许您一次添加多行(数量受 WHERE 子句限制)。您需要选择表要求的列不为空或不具有默认值。还要注意任何独特的约束。

      否则,您将使用 PL/SQL 或其他形式的脚本来插入多行。

      【讨论】:

        【解决方案3】:

        对于没有默认值的每一列,或者您想要插入默认值以外的值,您需要提供明确的名称和值。

        如果要选择所有列并按原样插入,则只能使用隐式列表 (*)。

        由于要更改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 的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-04
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 2014-11-26
          • 2018-12-19
          相关资源
          最近更新 更多