2017-02-22 57 views
0

我試圖插入到一個表使用選擇並添加一些額外的列。額外的列有默認值和一個被默認所以不知道序列填充爲什麼我不能做:T-SQL插入與選擇和額外列填充默認值

insert into ADDRESS_HIST 
    select * from ADDRESS; 

四處錯誤:

Msg 213, Level 16, State 1, Line 3
Column name or number of supplied values does not match table definition.

insert into ADDRESS_HIST 
    select 
     *, 
     null as [END_DATE], 
     getdate() as [EFFECTIVE_DATE], 
     next value for ADDRESS_HIST_ID_SEQ as [ADDRESS_HIST_ID] 
    from 
     ADDRESS; 

錯誤:

Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'ADDRESS_HIST_ID', table 'ADDRESS_HIST'; column does not allow nulls. INSERT fails.

我已經測試了我的序列和它的工作正常。

任何見解最受讚賞。

編輯:我認爲,第一個例子是可能的,如果額外的列或者提供了一個默認值或可爲空。我的錯。 第二個例子的問題是什麼?我清楚地從ADDRESS_HIST_ID的序列中提供一個值。

+0

錯誤消息非常明確。 –

+0

爲表格添加模式將會很有幫助。使用相應的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。 – HABO

回答

1

錯誤信息已經給你答案。

在第一種情況下,如果ADDRESS_HIST列數是從的ADDRESS不同,你必須像

INSERT INTO TABLE_NAME 
    (column1, column2, column3,...columnN) VALUES 
    (value1, value2, value3,...valueN); 

指定列在第二種情況下,很顯然你要插入一個空值轉換爲ADDRESS_HIST的不可空列。

+0

因此,即使默認值由表定義提供,第一種情況也是不可能的。第二種情況是可能的?再一次,它顯而易見,我爲錯誤消息所抱怨的列提供了一個值。 – rocketboy2000

+0

@ rocketboy2000是的,默認值沒有幫助。它不知道應該給哪一列默認值。您最好明確指定列,以確保在表格模式更改的情況下數據插入不會混亂。第二種情況,如果列數匹配可能會很好。但這不是首選。 – ydoow

+0

我想出了我的問題是什麼......可以嘗試限定額外列名稱,如「as extra_column1」等,但sql server似乎忽略了這一點。列名必須按它們在表格中出現的順序排列。 – rocketboy2000