2014-03-04 46 views
0

我已經添加了一個新的列(NewValue)到我的表,其中包含一個int並允許空值。現在我想更新列,但是我的insert語句只嘗試更新表中的第一列,而不是我指定的列。不能將值NULL插入列錯誤顯示錯誤的列名稱

我基本上開始,我把我的初始數據到一個臨時表,它有兩列這樣的:

create table #tempTable 
(
    OldValue int, 
    NewValue int 
) 

然後我做一個插入到該表,並基於這些信息的NewValue可以爲空。在#tempTable

示例數據:

OldValue  NewValue 
    --------  -------- 
    34556  8765432 
    34557  7654321 
    34558  null 

一旦這完成我的計劃要插入的NewValue到主表中,像這樣:

insert into myPrimaryTable(NewValue) 
select tt.NewValue from #tempTable tt 
left join myPrimaryTable mpt on mpt.Id = tt.OldValue 
where tt.NewValue is not null 

我只想要的NewValue插入到myPrimaryTable行Id與OldValue匹配。但是,當我嘗試執行此代碼時,出現以下錯誤:

無法將值NULL插入到'myCode'列中,表'myPrimaryTable';列不允許有空值。 INSERT失敗。

但我沒有試圖插入'myCode',我指定'NewValue'作爲列,但它似乎沒有看到它。我檢查過NewValue,它被設置爲允許int,並且被設置爲允許null,並且它存在於正確的數據庫右表中。列'myCode'實際上是表中的第二列。有人可以請指出我正確的方向與這個錯誤?

在此先感謝。

回答

2

INSERT始終創建新行,它永遠不會修改現有行。如果您跳過爲INSERT中的列指定值,並且該列沒有綁定到DEFAULT而且不是identity,那麼該列在新行中將爲NULL - 因此是您的錯誤。我相信你可能在尋找UPDATE而不是INSERT

下面是可能適合您的潛在查詢:

UPDATE mpt 
SET 
    mpt.NewValue = tt.NewValue 
FROM 
    myPrimaryTable mpt 
    INNER JOIN #tempTable tt 
     ON mpt.Id = tt.OldValue -- really? 
WHERE 
    tt.NewValue IS NOT NULL; 

注意,我把它改成一個INNER JOIN。 A LEFT JOIN顯然是不正確的,因爲您只對具有值的行進行過濾#tempTable,並且不想更新mpt,在那裏沒有與tt匹配--so LEFT JOIN表示錯誤的邏輯連接類型。

我把「真的嗎?」作爲對ON條款的評論,因爲我想知道OldValue是否真的是Id。它可能是 - 你最瞭解你的餐桌。它只是在我心中提出了一個溫和的紅旗,以查看Id列與其名稱中沒有Id的列進行比較(因此如果它的正確,我建議OldId作爲比OldValue更好的列選擇)。

此外,我建議您再也不要僅命名爲Id的列 - 數據庫中每個表的列名應該相同。此外,當涉及到聯合時間時,當來自不同表格的列可以重合時,您將更可能犯錯。在Something表格中,按照SomethingId的格式更好,而不僅僅是Id。相應地,建議的舊列名將是OldSomethingId

+0

謝謝,這是一個了不起的答案,很好的解釋。 :) –