为什么我必须在此insert语句中包含主键列?

时间:2013-01-11 05:36:14

标签: sql sql-server tsql sql-server-ce sql-server-express

给定一个带有名为"客户端"的表的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 Server总是足够聪明,可以忽略列计数中的标识/主键列,并且只需要计算出自动递增的值,而不必拼出特定的列名。

虽然这里的另一个不同之处在于我之前总是使用SQL Management Studio来破坏表定义,而在这种情况下我会通过VS 2012和SQL Server Compact Edition。所涉及的用户界面显然是非常不同的,所以我想也许在管理工作室中为表格或某些事情指定了什么东西可以防止这个问题发生?

4 个答案:

答案 0 :(得分:3)

如果未在insert语句中指定列,则会考虑所有列。即使其中一列是自动增量。

Insert - MSDN

  显式值插入时,必须使用

column_list   标识列,并且SET IDENTITY_INSERT选项必须为ON   桌子。

答案 1 :(得分:1)

您忘记提到表Clients的列名为Title。第一个查询有效,因为您已明确定义了在语句中指定的列的值。

第二个失败是因为您使用Implicit类型的INSERT语句。使用该类型的INSERT时,必须为表中的所有列指定所有值。由于表格中的第一列为IDAuto_IncrementNULL,因此INSERT INTO Clients VALUES (NULL, '', 'John', '', '', 'Smith', '', 'True') 可用于替换该值。

{{1}}

答案 2 :(得分:1)

可以用两种形式编写INSERT INTO语句。

第一个表单没有指定插入数据的列名,只指定了它们的值:

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

仅当提供的数量与列数完全

匹配时,此功能才有效

第二种形式指定列名和要插入的值:

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

这是必须使用的表单,即使存在标识类型的ID列。

拉​​吉


答案 3 :(得分:0)

我认为''代表一个空字符串,无法将其插入整数值

因此您可以指定NULL而不是''