列默认值优先于INSERT..SELECT语句中的插入值

时间:2012-08-16 14:35:06

标签: sql oracle11g

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

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

示例:

SOURCE_TABLE包含lastupdate = 16.08.12 15:41:44

执行该语句后,lastupdate中的TARGET_TABLE设置为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企业版11.2.0.2.0版 - 64位生产

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

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

1 个答案:

答案 0 :(得分: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语句只有一列{{1} }}

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