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

26
insert into Student 
values('1', 'joedio', 'newyark', GETDATE())

当我尝试运行这个 SQL 时,出现了以下错误信息:

只有在使用列列表并开启 IDENTITY_INSERT 时,才能为表 'Student' 中的身份列指定显式值。


错误消息说的是一切 - Sandip - Frontend Developer
4
@Sandip-FrontendDeveloper 显然不是,否则就不会有这个问题了。 - I try so hard but I cry harder
7个回答

25
如果您想通过查询插入自增的主键,那么您必须设置IDENTITY_INSERT ON,如下所示,它将允许您通过查询插入唯一值:

如果你想要在查询中插入自动递增的主键,你需要设置 IDENTITY_INSERT ON 如下,这会允许你通过查询插入唯一值:

SET IDENTITY_INSERT [Tablename] ON;

您的查询现在将是:

SET IDENTITY_INSERT Student ON;

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

SET IDENTITY_INSERT Student OFF;

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

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


请检查您的列 IDENTITY_INSERT 属性。 - Sandip - Frontend Developer
我发现在使用SELECT语句时,我必须同时指定列名才能使其正常工作。例如:INSERT INTO Student (column1, coulumn2.......columnN) SELECT value1, value2...... valueN FROM Table,而不是INSERT INTO Students SELECT......... - Richard Hudson

13
如果您的表具有标识列,则在插入时必须提及所有其他列。
仅供示例:
INSERT INTO Student (ID, Name, State, Date) VALUES('1','joedio','newyark',GETDATE())
如果第一列是身份证,则在插入时跳过该值:
INSERT INTO Student (Name, State, Date) VALUES('joedio','newyark',GETDATE())

如果您想要向SQL Server的自增列中插入值

SET IDENTITY_INSERT IdentityTable ON

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

SET IDENTITY_INSERT IdentityTable OFF

并且还可以参考链接 如何在 SQL Server 中向标识列插入值 获取更多信息。


我只想手动插入第一列即标识列的值。该怎么做? - divikdiya

5

试试这个:如果你真的需要在IDENTITY列中插入值,那么使用给出的答案之一。

SET IDENTITY_INSERT [Tablename] ON;
INSERT INTO [Tablename]..........
SET IDENTITY_INSERT [Tablename] OFF;

否则,只需排除错误并从values中排除第一个值。
INSERT INTO Student --No need to add column definition if you are inserting rest of all
VALUES('joedio', 'newyark', GETDATE()) --Error Free

4

试着通过查看它来澄清这个概念。

身份 (属性)

在将主键定义为身份后,您无需传递其值的参数。它的值将自动增加。


1
  1. 在SQL Server中,当ID列自动递增且您正在传递ID时

如果不存在(SELECT * FROM Student WHERE ID = 1) 然后

SET IDENTITY_INSERT Student ON;

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

关闭学生表自增功能;

END

2. 在 SQL Server 中,当 ID 列为自增列且您没有传递 ID 时

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

3. 在 MySQL 中,用户可以使用

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

或者

INSERT IGNORE INTO Student (Name, State, Date) VALUES('joedio','newyark',GETDATE());

0

IDENTITY_INSERT 允许将显式值插入到表的标识列中。 使用此查询并在表上设置 IDENTITY_INSERT

SET IDENTITY_INSERT Student ON

注意:在任何时候,一个会话中只能有一个表的IDENTITY_INSERT属性设置为ON。

0
SET IDENTITY_INSERT Student ON;

INSERT INTO Student (RegNo, Name, Address, CreatedTime) VALUES('2','calibio','newyark',GETDATE());

SET IDENTITY_INSERT Student OFF;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接