3

给定一个 SQL Server Express Compact Edition 数据库,其中包含一个名为“Clients”的表,其中包含以下列:

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。所涉及的用户界面显然有很大不同,所以我想可能是为表指定了某些内容,或者当您在 Management Studio 中执行此操作时可以防止此问题发生?

4

4 回答 4

3

如果您没有在插入语句中指定列,那么它将考虑所有列。即使其中一列是自动递增的。

插入 - MSDN

将显式值插入标识列时必须使用 column_list ,并且表的 SET IDENTITY_INSERT 选项必须为 ON。

于 2013-01-11T05:38:46.993 回答
2

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

第一种形式没有指定将插入数据的列名,只指定它们的值:

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

仅当提供的值的数量与列数完全匹配时,这才有效

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

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

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

拉吉


于 2013-01-11T05:43:22.657 回答
1

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

第二个失败,因为您使用的是语句Implicit类型。INSERT使用该类型时INSERT,您必须为表中的所有列指定所有值。由于表中的第一列 isID并且它是Auto_Incremented,NULL因此可以用于替换值。

INSERT INTO Clients VALUES (NULL, '', 'John', '', '', 'Smith', '', 'True')
于 2013-01-11T05:40:53.663 回答
0

我认为''代表一个空字符串,它不能插入整数值

所以你可以指定 NULL 而不是 ' '

于 2013-01-11T06:49:30.157 回答