2012-08-16 62 views
0

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

即使在SOURCE_TABLE中此列总是有值。

实施例:

SOURCE_TABLE包含lastupdate = 16.08.12 15:41:44

执行该语句之后,在TARGET_TABLElastupdate获取设置为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数据库11g企业版发布11.2.0.2.0 - 64位生产

我想从SOURCE_TABLE复制到TARGET_TABLE的价值,而不是设置为SYSDATE

我在这里错过了什么?谢谢。

回答

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. 

我不得不改变你的INSERTSOURCE_TABLE因为CREATE TABLE声明只有一列E到指定列E而非F

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. 

我也不得不改变你的INSERTTARGET_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 
+0

对于关于触发器的提示,你是绝对正确的。我确信它只会生成ID(就像你写的是正确的),但是这个东西也会更新lastupdate列。和关于E/F的不匹配有关。由于数据库缺少权限,我无法首先看到触发器定义。多谢。 – 2012-08-16 15:17:24