1

我有一个定义如下的表:

create table HLV (
id nvarchar(7) check (id LIKE 'HLV[0-9][0-9][0-9][0-9]') Primary key,
birthday date,
full_name nvarchar(20) NOT NULL,
win int check (win > 0),
lose int check (lose > 0),
draw int check (draw > 0)
) 

我执行代码并且它可以工作,但是当我将数据插入其中时

insert into HLV values ('HLV0001',GETDATE(), 10,5,6)

我得到了错误

列名或提供的值的数量与表定义不匹配。

是因为支票错了吗?

4

3 回答 3

3

不,这是因为您错过full_name了插入语句:

insert into HLV values ('HLV0001',GETDATE(), 'michael jordan' ,10,5,6)
于 2015-04-30T05:10:35.933 回答
1

表中有 6 列,但插入语句 values 子句中只有 5 个值。您可以通过指定所有 6 个必需值来解决此问题,但是我也强烈建议在插入语句中指定列名,以使其更健壮,更易于更改,更具自记录性。您不必确定实际的列顺序。您可以省略可空列和默认列。可以在不破坏语句的情况下添加新的可为空或默认列。

ALTER TABLE HLV ADD gender char(1) NULL

INSERT HLV (id, birthday, full_name, win, lose, draw)
VALUES ('HLV0001', GETDATE(), 'first last', 10, 5, 6)

INSERT HLV (full_name, id, birthday)
VALUES ('last, first', 'HLV0002', GETDATE())

MSDN上有大量示例。

于 2015-04-30T05:56:06.097 回答
1

只是为了扩展 Giorgi Nakeuri 的答案,

当您不使用insert into HLV任何列名时,sql server 假定您将传递表中定义的所有列(除了类似的列identity)。在您的Insert查询中

insert into HLV values (N'HLV0001',GETDATE(), 10,5,6)

SQL Server 期望所有列的值id, birthday,full_name,win,lose,draw 但是您只传递 的值id, birthday,win,lose,draw,因此提供的值的数量与表定义不匹配。

如果您列出full_name允许NULL的值或有DEFAULT约束,您可以执行以下操作

insert into HLV(id, birthday,win,lose,draw) values (N'HLV0001',GETDATE(), 10,5,6)

此外,根据您对 的检查约束ID,您应该将其类型从 更改nvarchar(7)CHAR(7)

于 2015-04-30T05:49:56.590 回答