是否有在 sql 数据库中生成增量序列号的最佳实践?

卡尔·廷

我写了一个查询来自动增加新记录的序列号,它在单个调用中工作正常。

insert into testTable (sequence_no) 
    case when exists (select sequence_no from testTable)
         then (select top(1) sequence_no +1 from testTable order by sequence_no desc)
         else '1'
    end as sequence_no

然后我在上面添加一个线程注释,循环 100000 次,打开 2 个线程并同时运行它。
线程1:

declare @cnt INT =0;
while @cnt<100000
begin 
insert into testTable (sequence_no, thread_no) 
    case when exists (select sequence_no from testTable)
         then (select top(1) sequence_no +1 from testTable order by sequence_no desc)
         else '1'
    end as sequence_no, '1' as thread_no
SET @cnt = @cnt + 1;
END;

线程2:

declare @cnt INT =0;
while @cnt<100000
begin 
insert into testTable (sequence_no, thread_no) 
    case when exists (select sequence_no from testTable)
         then (select top(1) sequence_no +1 from testTable order by sequence_no desc)
         else '1'
    end as sequence_no, '2' as thread_no
SET @cnt = @cnt + 1;
END;

结果大约 70% 请求成功,其他失败

违反 PRIMARY KEY 约束“sequence_no”。无法在对象“dbo.testTable”中插入重复键。

我认为如果我在每个请求上使用一个事务就可以解决,但结果是相似的,大约 70% 成功,而其他人则因 PK 重复而失败。

这是否意味着我的做法不利于序列号生成?
有人可以给我改进吗?

格拉纳达编码器

每个 RDBMS 系统通常都有自己的“自动编号”(通常用于 PrimaryKeys)设置。

MySql、Ms-Sql-Server、ORACLE(文章显示了每种语法的 3 种不同的语法……仅在一个 url 上)

https://www.w3schools.com/sql/sql_autoincrement.asp

PostGres:

https://chartio.com/resources/tutorials/how-to-define-an-auto-increment-primary-key-in-postgresql/

您的问题带有 (microsoft)sql-server 标记,因此我将其粘贴。

SQL Server 的语法 以下 SQL 语句将“PersonKey”列定义为“Person”表中的自增主键字段:

CREATE TABLE dbo.Person (
    PersonKey int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255)
);

不要重新发明轮子。

因此,除非您(尝试)在 < 2 秒内插入一百万行......使用已经存在的内容。

意见。

您不应该关心每个主键是否完全按顺序排列。又名,“差距”应该没问题。

如果你认为你需要完美的测序,你需要问自己“为什么”。

主键必须是唯一的。有“顺序”有助于索引。

订购了 1,2,3,6,7,9,11。(4,5,8 不见了,但它们不见了真的很重要吗?)

我要补充一点,自 2016 版以来,Sql Server 女士已经添加了“序列”(或者是 2014 年?)

https://docs.microsoft.com/en-us/sql/relational-databases/sequence-numbers/sequence-numbers?view=sql-server-2016

有理由选择其中之一。

https://www.sqlshack.com/difference-between-identity-sequence-in-sql-server/

2 美分的解释是序列可以提供一系列值。而且它不绑定到单个表(就像身份一样)。

但实际上,您最终会在值中有更多“间隙”......因为一旦请求序列,就永远不会重新生成相同的值......即使 INSERT 的潜在行实际上并未使其成为插入行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有一个 SQL 函数可以用来在多行上旋转序列号

如何检查SQL数据库中是否有记录?

Couchbase Lite是否真的没有SQL数据库

RDBM和SQL数据库中有关主键,自动递增和UUID的最佳实践

如何在SQL Server 2008 R2中生成没有复制数据的数据库脚本

快照数据库是否有与SQL中源数据库相同的即时记录?

是否可以从JSON文件生成SQL数据库?

SQL Server TDE-使用T-SQL显示是否有数据库密钥

是否有春天数据库迁移工具没有SQL查询?

连接到SQL数据库的最佳实践是什么?

是否有可能只包含区分大小写的数据的SQL Server数据库

是否有加载了测试数据库的“基于 Web”的 sql 测试环境?

是否可以使用带有Active Record的SQL注入来修改数据库

使用SQL Azure数据库时,存储过程是否有任何差异/限制

F#类型提供程序SQL是否在VS中加载所有数据库?

是否可以通过检查数据库有多少行来进行SQL注入?

微服务是否兼容现有的 SQL 数据库?

SQL Server:如何通过动态SQL生成序列号

是否有任何SQL查询来检查值是否存在或不存在于数据库表中

具有数据库的离线工具的最佳实践

SQL Server检查数据库视图中的所有列是否有特定的字符串值

是否有任何功能来翻译SQL中的数据

数据本身是否有SQL编辑器?

PHP 中是否有函数或命令可以排除数据未插入 sql 数据库的原因?

有什么方法可以从SQL Server中的SQL查询生成数据库脚本?

在sql oracle中为特定位置添加具有序列号的行

SQL。从两个不同的表中选择所有序列号

将现有数据库附加到sql localdb的最佳方法是什么?

即使没有显式使用事务,ACID投诉SQL数据库是否仍然是“ ACID”?