如何在SQL Server的主键列中插入值?

div*_*iya 7 sql-server sql-server-2005

insert into Student 
values('1', 'joedio', 'newyark', GETDATE())
Run Code Online (Sandbox Code Playgroud)

尝试运行此SQL时收到以下错误消息:

仅当使用列列表并且IDENTITY_INSERT为ON时,才能为表'Student'中的identity列指定一个显式值。

San*_*per 15

如果您想通过查询插入主键,即使它是自动增量,那么您必须设置IDENTITY_INSERT ON如下,它将允许您通过查询插入唯一值:

SET IDENTITY_INSERT [Tablename] ON;
Run Code Online (Sandbox Code Playgroud)

您的查询现在将是:

SET IDENTITY_INSERT Student ON;

INSERT INTO Student VALUES('1','joedio','newyark',GETDATE());

SET IDENTITY_INSERT Student OFF;
Run Code Online (Sandbox Code Playgroud)

如果您希望 SQL 自行管理,则默认设置为IDENTITY_INSERT OFF并设置自动增量,这意味着在每次插入时,新值都会分配给该 PK 列。

最好使用默认设置执行SET IDENTITY_INSERT Student OFF因为通过手动插入插入重复值的可能性,它会引发错误。


Din*_*hDB 9

如果您的表有Identity Column,那么您必须在插入时提及所有其他列。

仅用于示例:

INSERT INTO Student (ID, Name, State, Date) VALUES('1','joedio','newyark',GETDATE())
Run Code Online (Sandbox Code Playgroud)

如果第一列是标识,则在插入时跳过该值:

INSERT INTO Student (Name, State, Date) VALUES('joedio','newyark',GETDATE())
Run Code Online (Sandbox Code Playgroud)

如果您想将值插入到标识列中 SQL Server

SET IDENTITY_INSERT IdentityTable ON

INSERT INTO Student (ID, Name, State, Date) VALUES('1','joedio','newyark',GETDATE())

SET IDENTITY_INSERT IdentityTable OFF
Run Code Online (Sandbox Code Playgroud)

并参考链接如何将值插入 SQL Server 中的标识列以获取更多信息。


Sus*_*ang 6

尝试一下:如果您确实想将值插入到IDENTITY列中,那么您必须首先为表启用此功能

SET IDENTITY_INSERT [Tablename] ON;
INSERT INTO [Tablename]..........
SET IDENTITY_INSERT [Tablename] OFF;
Run Code Online (Sandbox Code Playgroud)

否则,只需从中排除第一个值即可消除错误values

INSERT INTO Student --No need to add column definition if you are inserting rest of all
VALUES('joedio', 'newyark', GETDATE()) --Error Free
Run Code Online (Sandbox Code Playgroud)