仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'ClassInfo'中的标识列指定显式值。

在资源管理器里面给表插入数据时,主键一直显示null,无法插入数据,但是非主键可以插入数据,当时感觉很奇怪,不过这个表是前一段时间创建的,一些设置约束条件也不记得了,然后表右键打开编辑脚本到窗口以为是正常的(下面的建表语句)

CREATE TABLE [dbo].[ClassInfo](
	[cId] [int] IDENTITY(1,1) NOT NULL,
	[cTitle] [nvarchar](10) NOT NULL,
 CONSTRAINT [PK_ClassInfo] PRIMARY KEY CLUSTERED 
(
	[cId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

然后在自己新建查询窗口编写T-SQL语句,添加数据的时候出错了

仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'ClassInfo'中的标识列指定显式值。_第1张图片

消息 8101,级别 16,状态 1,第 1 行 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'ClassInfo'中的标识列指定显式值。

问题原因:

建表的时候给主键设置的约束条件是自增,不能直接添加数据

解决方案:

方法一(使用资源管理器):既然主键自增,那只需要添加其他属性的数据,不用管主键的值(默认从1开始)

方法二(使用T-SQL语句):必须先设置IDENTITY_INSERT 为 ON,添加数据完成后再设置IDENTITY_INSERT 为 OFF(如果不设置下次不能自增)

set IDENTITY_INSERT ClassInfo ON    --需要设置IDENTITY_INSERT为ON才能成功
insert into ClassInfo(cId,cTitle)   --需要设置(cId,cTitle)指定列才能成功
values(003,'Nacy')
set IDENTITY_INSERT ClassInfo OFF

还需要注意的是:

1. 我在开始使用资源管理的时候,点了一下非主属性,然后主属性自增为1,但是我当时不理解以为是自己乱点输进去的1,所以后面又用sql语句添加主属性为1的数据,这就报了错:

消息 2627,级别 14,状态 1,第 8 行 违反了 PRIMARY KEY 约束 'PK_ClassInfo'。不能在对象 'dbo.ClassInfo' 中插入重复键。

这时候只要将sql语句中的主属性改一下就可以了 

2. 添加数据的时候需要set PRIMARY KEY,但是修改数据的时候就不需要了,直接修改就可以了

你可能感兴趣的:(SQL,sever)