2012-02-28 84 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)