【问题标题】:Column default is prioritized over insert value in INSERT..SELECT statement列默认优先于 INSERT..SELECT 语句中的插入值
【发布时间】:2012-08-16 14:35:06
【问题描述】:

当使用下面的INSERT..SELECT 语句将值插入TARGET_TABLE 时,列lastupdate 的列默认值似乎优先于SELECT 语句产生的值。

即使在SOURCE_TABLE 中始终存在此列的值。

例子:

SOURCE_TABLE 包含lastupdate = 16.08.12 15:41:44

执行语句后,TARGET_TABLE 中的lastupdate 被设置为SYSDATE,例如16.08.12 15:49:14:

INSERT INTO TARGET_TABLE (A, B, C, D, LASTUPDATE, F)
        SELECT A, B, C, D, LASTUPDATE, F
            FROM SOURCE_TABLE
            WHERE B = 'some_value';


CREATE TABLE TARGET_TABLE
(
ID NUMBER NOT NULL,
A VARCHAR2(255 CHAR) NOT NULL,
B VARCHAR2(255 CHAR) NOT NULL,
C CLOB NOT NULL,
D VARCHAR2(255 CHAR),
LASTUPDATE DATE DEFAULT SYSDATE,
E DATE DEFAULT SYSDATE
)

Oracle 版本:Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production

我希望将值从SOURCE_TABLE 复制到TARGET_TABLE,而不是设置为SYSDATE

我在这里缺少什么?谢谢。

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    您能否从显示此行为的 SQL*Plus 会话中复制和粘贴?它不会在我的 11.2 数据库上重现,这不是我亲眼见过的事情。

    SQL> CREATE TABLE TARGET_TABLE
      2  (
      3  ID NUMBER NOT NULL,
      4  A VARCHAR2(255 CHAR) NOT NULL,
      5  B VARCHAR2(255 CHAR) NOT NULL,
      6  C CLOB NOT NULL,
      7  D VARCHAR2(255 CHAR),
      8  LASTUPDATE DATE DEFAULT SYSDATE,
      9  E DATE DEFAULT SYSDATE
     10  );
    
    Table created.
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  CREATE TABLE SOURCE_TABLE
      2  (
      3  ID NUMBER NOT NULL,
      4  A VARCHAR2(255 CHAR) NOT NULL,
      5  B VARCHAR2(255 CHAR) NOT NULL,
      6  C CLOB NOT NULL,
      7  D VARCHAR2(255 CHAR),
      8  LASTUPDATE DATE DEFAULT SYSDATE,
      9  E DATE DEFAULT SYSDATE
     10* )
    SQL> /
    
    Table created.
    

    我不得不将您的INSERT 更改为SOURCE_TABLE 以指定E 列而不是F,因为CREATE TABLE 语句只有一个列E

    SQL> insert into source_table( id, a, b, c,d, lastupdate, e )
      2    values( 1, 'A', 'some_value', empty_clob(), 'D', date '2012-01-01', sysdate );
    
    1 row created.
    

    我还必须将您的 INSERT 更改为 TARGET_TABLE 以添加 ID 列,因为它具有 NOT NULL 约束。我假设在您的实际示例中,这可能是由TARGET_TABLE 上的触发器填充的,该触发器从序列中选择数据。这个触发器(或其他触发器)是否也可以设置LASTUPDATE 值?

    SQL> ed
    Wrote file afiedt.buf
    
      1  INSERT INTO TARGET_TABLE (ID, A, B, C, D, LASTUPDATE, E)
      2          SELECT ID, A, B, C, D, LASTUPDATE, E
      3              FROM SOURCE_TABLE
      4*             WHERE B = 'some_value'
    SQL> /
    
    1 row created.
    
    SQL> select id, lastupdate from target_table;
    
            ID LASTUPDAT
    ---------- ---------
             1 01-JAN-12
    

    【讨论】:

    • 感谢有关触发器的提示,您是绝对正确的。我很确定它只会生成 ID(正如你写的那样),但是这个东西也会更新 lastupdate 列。并对关于 E/F 的不匹配感到抱歉。由于缺少对数据库的权限,我首先无法看到触发器定义。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2014-05-01
    • 1970-01-01
    相关资源
    最近更新 更多