2012-02-28 57 views
1

我尝试使用另一个表来更新表。我得到错误号码407.它说我试图在一个不可空列中插入一个空值。

我检查了它的列my_TIMESTAMP列。通常它不能为空。因为我更新了柱子,n与current timestamp。它应该生成一个时间戳。哪里有问题?

DB2更新语句中丢失

UPDATE table1 mytable 
    SET (
     my_PROCESS, 
     my_TIMESTAMP, 
     col3, 
     COL5 
    ) = (
    SELECT 
     (select PROCESSNAME from table3), 
     current timestamp, 
     COL3, 
     COL5 
    FROM table2 mytable2 
    WHERE mytable.COL4 = mytable2.COL4 
    ) 
    WHERE EXISTS (
     SELECT 'x' 
     FROM table1 mytable1, table2 mytable21 
     WHERE mytable1.COL4 = mytable21.COL4    
    ); 
+0

你的内部'SELECT'语句的结果是什么?它是否包含对应于目标表中任何不可空的列的空值。 – 2012-02-28 08:44:10

+0

@husbas错误指向'TBSPACEID = 7,TABLEID = 265,COLNO = 2''这是my_TIMESTAMP列。 – Kayser 2012-02-28 08:48:41

+0

从语句中删除UPDATE-SET部分并执行它,然后查看结果并扫描“ - ”。那一个会产生问题 – 2012-02-28 09:24:41

回答

0

我用where ... IN替换where exists条件改变了where条件。

UPDATE table1 mytable 
    SET (
     my_PROCESS, 
     my_TIMESTAMP, 
     col3, 
     COL5 
    ) = (
    SELECT 
     (select PROCESSNAME from table3), 
     current timestamp, 
     COL3, 
     COL5 
    FROM table2 mytable2 
    WHERE mytable.COL4 = mytable2.COL4 
    ) 
    WHERE mytable.id IN (
     SELECT mytable1.id 
     FROM table1 mytable1, table2 mytable21 
     WHERE mytable1.COL4 = mytable21.COL4    
    ); 
0

这不是小事,由于没有访问这些数据来回答。但是你是否尝试使用MERGE INTO命令解决这个问题?在这种情况下,您可以通过在USING中仅执行语句来检查合并的数据。当然,您可以在此语句中添加谓词以使行设置更短。

MERGE INTO TABLE1 AS T1 
USING (SELECT T3.PROCESSNAME_1 AS MY_PROCESS, T2.COL3, T2.COL4, T3.COL5 
FROM TABLE3 T3, TABLE2 T2) AS Q1 
ON T1.COL4 = Q1.COL4 
WHEN MATCHED THEN 
UPDATE SET (MY_PROCESS, MY_TIMESTAMP, COL3, COL5) = 
(Q1.MY_PROCESS, CURRENT TIMESTAMP, Q1.COL3, Q1.COL5)