給定的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中執行這些操作時發生的問題。
看到(和跟着!):[踢壞的習慣:使用SELECT * /省略列表](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick-using- select-omitting-the-column-list.aspx) - 總是明確指定列列表被認爲是最佳實踐 - 無論是在「SELECT」還是在「 'INSERT'語句 –
這個[確實工作](http://sqlfiddle.com/#!3/22c6d/2)。這個問題一定是別的。 (例如,你的ID不是一個真正的IDENTITY,而是由一個觸發器來處理。)話雖如此,我同意@marc_s的評論。 –
「我現在使用的是一個非常低端的SQL Server版本,而我習慣於使用更專業的版本」 - 更詳細請參考SQL Server Compact Edition Express – AakashM