【问题标题】:How to insert value into primary key column in SQL Server?如何在 SQL Server 的主键列中插入值?
【发布时间】:2018-07-11 08:57:32
【问题描述】:
insert into Student 
values('1', 'joedio', 'newyark', GETDATE())

我在尝试运行此 SQL 时收到此错误消息:

只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表“Student”中的标识列指定显式值。

【问题讨论】:

  • 错误说明一切

标签: sql-server sql-server-2005


【解决方案1】:

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

仅供参考:

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

更多信息请参考链接How to Insert Values into an Identity Column in SQL Server

【讨论】:

  • 我只想手动插入作为标识列值的第一列。怎么办?
【解决方案2】:

如果你想通过查询插入主键,即使它是自动递增的,那么你必须设置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属性
  • 我发现我还必须指定列名才能使用 select 语句使其工作。即 INSERT INTO Student (column1, coulumn2.......columnN) SELECT value1, value2...... valueN FROM Table 而不是 INSERT INTO Students SELECT.........
【解决方案3】:

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

SET IDENTITY_INSERT Student ON

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

【讨论】:

    【解决方案4】:

    试着通过看一下这个概念来弄清楚它。

    IDENTITY (Property)

    在提到主键作为标识之后,您无需为其值传递参数。它的值会自动递增。

    【讨论】:

      【解决方案5】:
      SET IDENTITY_INSERT Student ON;
      
      INSERT INTO Student (RegNo, Name, Address, CreatedTime) VALUES('2','calibio','newyark',GETDATE());
      
      SET IDENTITY_INSERT Student OFF;
      

      【讨论】:

        【解决方案6】:
        1. 在 SQL Server 中,当 ID 列是自动增量并且您正在传递 ID 时

        如果不存在(SELECT * FROM Student WHERE ID = 1) 那么

        SET IDENTITY_INSERT 学生开启;

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

        SET IDENTITY_INSERT 学生关闭;

        END
        

        2.当 ID 列是自动增量并且您没有传递 ID 时,在 sql server 中

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

        3.在我的sql中使用可以使用

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

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

        【讨论】:

          【解决方案7】:

          试试这个:如果你真的想在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
          

          【讨论】:

            猜你喜欢
            • 2011-10-11
            • 2011-04-22
            • 2021-04-09
            • 1970-01-01
            • 1970-01-01
            • 2019-01-24
            • 1970-01-01
            • 1970-01-01
            • 2021-12-03
            相关资源
            最近更新 更多