当前位置: 首页 > 知识库问答 >
问题:

如何将auto_increment键插入SQLServer表

昌琪
2023-03-14

我想将行插入到具有唯一的、非自动递增主键的表中。

是否有一个本机SQL函数来计算最后一个键并将其递增,还是必须分两步进行:

key = select max(primary.key) + 1

INSERT INTO dbo.TABLE (primary.key, field1, fiels2) VALUES (KEY, value1, value2)

共有3个答案

夹谷志
2023-03-14

在我看来,最好的答案是修复表,使PK列成为标识列。(请看我对塞巴斯蒂安·梅恩关于为什么你目前选择的答案不是最好的答案的评论。)使现有PK成为标识列的唯一方法是交换表。大致:

BEGIN TRAN;
-- Rename all constraints in original table
EXEC sp_rename 'dbo.YourOriginalTable.PK_ConstraintName', 'PKConstraint_Backup';
EXEC sp_rename 'dbo.YourOriginalTable.OtherConstraintName', 'OtherConstraintName_Backup';
CREATE TABLE dbo.WorkTable (
    YourPKColumn int identity(1, 1) NOT NULL -- your PK converted to identity
    CONSTRAINT PK_YourOriginalTableConstraintName PRIMARY KEY CLUSTERED,
    AllOtherColumns -- all your other columns exactly as in the original table
);

SET IDENTITY_INSERT dbo.WorkTable ON;
INSERT dbo.WorkTable (YourPKColumn, AllOtherColumns)
SELECT YourPKColumn, AllOtherColumns
FROM dbo.YourOriginalTable WITH (TABLOCKX, HOLDLOCK);

SET IDENTITY_INSERT dbo.WorkTable OFF;

-- Drop all FK constraints from other tables pointing to your table
ALTER TABLE dbo.TableWithFK_1
DROP CONSTRAINT FK_TableWithFK_1_YourOriginalTableSomethingID;

-- Swap out the tables
EXEC sp_rename 'dbo.YourOriginalTable', 'YourOriginalTableBackup';
EXEC sp_rename 'dbo.WorkTable', 'YourOriginalTable';

-- If you didn't add them in the WorkTable creation,
-- add all other removed or needed constraints creation
ALTER TABLE dbo.YourOriginalTable
ADD CONSTRAINT OriginalConstraint (OriginalConstraintColumns);
-- Add back FK constraints from other tables to this one.
COMMIT TRAN;

您现在有一个表,其中有一个标识列,上面有一个聚集的PK。你可以插入它没有问题。不再有并发问题和容易出错的愚蠢的SELECT Max()1垃圾。

郭知
2023-03-14

从您的整个评论来看,表上有一个主键不是标识列。

如果您的版本SQL服务器是SQL2012你应该看看序列:http://msdn.microsoft.com/en-us/library/ff878091.aspx

在其他版本中,您需要使用IDENTITY属性重新创建表(http://msdn.microsoft.com/en-us/library/aa933196(v=sql.80)。aspx)的主键列,或使用两步方法。

如果采用两步方法,则需要确保并发运行的insert不会使用相同的新值。最简单的方法是将select和insert组合成一个值,并使用serializable table提示:

CREATE TABLE dbo.Tbl1(id INT PRIMARY KEY, val1 INT, val2 INT)

INSERT INTO dbo.Tbl1(id, val1, val2)
VALUES((SELECT ISNULL(MAX(id)+1,0) FROM dbo.Tbl1 WITH(SERIALIZABLE, UPDLOCK)), 42, 47);

SELECT * FROM dbo.Tbl1;
云开诚
2023-03-14

因为它是自动生成的,所以不要提供:

INSERT INTO bo.TABLE (field1, fiels2) VALUES (value1, value2)

更新:如果你的专栏是IDENTITY专栏,那就行了。

要向标识列提供显式值,必须执行以下操作:

set identity_insert bo.TABLE on

INSERT INTO bo.TABLE (primary_key, field1, fiels2) VALUES ((SELECT ISNULL(MAX(id) + 1, 0) FROM bo.Table), value1, value2)

set identity_insert bo.TABLE off

但没有令人信服的理由这么做。

 类似资料:
  • 问题内容: 我想将行插入具有唯一,非自动递增主键的表中。 是否有本机SQL函数来评估最后一个键并将其递增,还是我必须分两个步骤进行操作: 问题答案: 从整个注释来看,您在表上有一个主键,而不是标识列。 如果您的SQL Server版本是SQL 2012,则应查看序列:http : //msdn.microsoft.com/zh- cn/library/ff878091.aspx 在其他版本中,您需

  • 问题内容: 如何在不使用导入向导的情况下使用sql查询将Excel文件导入到sqlserver2008 Express Edition中的新表中 谢谢普拉迪 问题答案: 有一个Microsoft知识库文章,列出了所有可能的方法。 http://support.microsoft.com/kb/321686 我认为,使用或将是没有向导的最简单方法。(请参阅分布式查询) 请参阅OPENROWSET文档

  • 问题内容: 我对mysql有一个奇怪的问题。 我正在尝试更改表的列,该列是主键,并且对它定义了auto_increment约束。这也是其他多个表的外键参考。我需要在父级和所有子级中都更改此列的长度。 这将删除父表上的自动增量。添加约束的最佳方法是什么? 以下似乎失败了。 有没有更好的方法来实现这一目标? 编辑:显示创建为(更改后): 变更之前 谢谢! 问题答案: 您无需在MODIFY语句中指定:

  • 问题内容: 当我尝试粘贴到HTML文本文件中时,我总是被踢出外壳。如何才能做到这一点?我首先需要使用一些JavaScript对其进行编码吗? 例: 编辑 我只在HTML中放入单引号,然后将整个内容都用双引号引起来,但仍然没有好处。外壳错误: 问题答案: 您需要删除或编码字符串中的控制字符。 例如,将您的文本粘贴到此处,然后编码为UTF-8 ECMAScript(表示javascript字符串)。

  • 我正在尝试使用Hibernate 4.3和SQL Server 2014,仅对尚未存储的实体执行批量插入到表中。我创建了一个简单的表,其中定义了一个主键来忽略重复的键 尝试通过Stateless会话插入方法执行批处理插入,如果一个或多个实体已经存储到数据库表中,则批处理插入可能会失败:Hibernate抛出StaleStateException: 当批处理语句完成时,Hibernate会检查返回的