2013-01-11 62 views
2

給定的SQL Server Express Compact Edition數據庫與一個名爲「客戶」與下面的列表:爲什麼我必須在這個插入語句中包含主鍵列?

ID, FirstName, MiddleName, Nickname, LastName, Suffix, IsMale 

其中,ID是自動遞增的主鍵/標識值,當我嘗試在使用該命令表格:

INSERT INTO Clients (Title, FirstName, MiddleName, Nickname, LastName, Suffix, 
IsMale) VALUES ('', 'John', '', '', 'Smith', '', 'True') 

一切正常。但是,當我嘗試使用這個命令:

INSERT INTO Clients VALUES ('', 'John', '', '', 'Smith', '', 'True') 

這個錯誤顯示出來:

The number of columns in the query and the table must match. [ Number of columns 
in query = 7, Number of columns in table = 8 ] 

我一直在使用與SQL Server插入語句相當長的一段時間了,而這從來都不是一個問題;針對列數的驗證始終忽略自動遞增主鍵/標識類型。在這種情況下唯一的主要區別是我現在使用的是非常低端的SQL Server版本,而我習慣於使用更專業的版本。如果它可能很重要,我在C#程序中使用它。

這會導致什麼?謝謝。

編輯:這個問題很多重點是,我從來沒有遇到這個問題,當使用非自由,非緊湊版本的SQL Server。我以前使用過的SQL服務器總是足夠聰明,可以忽略列計數中的身份/主鍵列,並且只需找出自動遞增的值,而無需我拼寫出特定的列名稱。

雖然這裏的另一個區別是我以前一直使用SQL Management Studio來混淆表定義,而在這種情況下我正在經歷VS 2012和SQL Server Compact Edition。所涉及的用戶界面顯然非常不同,所以我想也許有一些事情是在表中指定的,或者是在Management Studio中執行這些操作時發生的問題。

+3

看到(和跟着!):[踢壞的習慣:使用SELECT * /省略列表](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick-using- select-omitting-the-column-list.aspx) - 總是明確指定列列表被認爲是最佳實踐 - 無論是在「SELECT」還是在「 'INSERT'語句 –

+3

這個[確實工作](http://sqlfiddle.com/#!3/22c6d/2)。這個問題一定是別的。 (例如,你的ID不是一個真正的IDENTITY,而是由一個觸發器來處理。)話雖如此,我同意@marc_s的評論。 –

+0

「我現在使用的是一個非常低端的SQL Server版本,而我習慣於使用更專業的版本」 - 更詳細請參考SQL Server Compact Edition Express – AakashM

回答

4

如果您沒有在插入語句中指定列,那麼它會考慮所有列。即使其中一列是自動增量。當明確的值被插入到一個 標識列必須使用

Insert - MSDN

column_list中,並且SET IDENTITY_INSERT選項必須爲ON爲 表。

+0

是的,但默認情況下,當您未提供列列表時,自動增量列的處理方式與計算列相同,這意味着您必須僅爲所有「正常」列指定值。這意味着OP的聲明應該起作用*如果ID確實是一個IDENTITY列(我現在對此非常懷疑,或者他們已經忘記提及)。 –

1

您忘記提及表Clients的列名稱爲Title。第一個查詢可以工作,因爲您已經明確定義了您在語句中指定的列的值。

第二個失敗,因爲您使用Implicit類型INSERT聲明。使用該類型的INSERT時,必須爲表中的所有列指定所有值。由於表中的第一列是ID而且它是Auto_Increment ed,因此可以使用NULL來替換該值。

INSERT INTO Clients VALUES (NULL, '', 'John', '', '', 'Smith', '', 'True') 
1

可以用兩種形式編寫INSERT INTO語句。

第一種形式不指定列名其中的數據將被插入,只有他們的價值觀:

INSERT INTO table_name 
VALUES (value1, value2, value3,...) 

如果值的數量設置的比賽正是列數這隻會工作

第二種形式同時指定列名和值將被插入:

INSERT INTO table_name (column1, column2, column3,...) 
VALUES (value1, value2, value3,...) 

這是必須使用的表單,即使存在身份類型的ID列。

拉吉


+0

由於某些原因,我總是在使用昂貴的,非緊湊版本的SQL Server/SQL Management Studio時看到它工作。 – Panzercrisis

0

我覺得'代表一個不能被插入到一個整數值

,以便您可以指定爲NULL,而不是一個空字符串「」

相關問題