concurrency - 在不使用身份规范的情况下自动化顺序整数 ID?
问题描述
是否有任何尝试/真正的方法来管理您自己的顺序整数字段,而无需使用 SQL Server 的内置身份规范?我认为这必须重复多次,而我的谷歌技能今晚让我失望了。
我的第一个想法是使用单独的表来管理 ID,并在目标表上使用触发器来管理设置 ID。并发问题显然很重要,但在这种情况下插入性能并不重要。
这里有一些我知道我需要注意的问题:
- 需要确保在多个进程同时运行时不会多次分配相同的 ID。
- 需要确保 1) 的任何解决方案都不会导致死锁
- 在一条语句中插入多条记录时,需要确保触发器正常工作;不仅是一次记录。
- 需要确保触发器仅在尚未指定 ID 时设置它。
最后一个要点的原因(以及我首先要在没有身份规范字段的情况下执行此操作的全部原因)是因为我想在不同的起点播种多个环境,并且我希望能够在每个环境之间复制数据以便给定记录的 ID 在环境之间保持相同(我必须使用整数;我不能使用 GUID)。
(也是的,我可以设置身份插入开/关来复制数据并仍然使用常规身份规范字段,但它会在每次插入后重新播种。然后我可以使用 DBCC CHECKIDENT 将其重新播种回原来的位置,但我觉得这种解决方案的风险太大了。一个人犯错只需要一次时间,然后当我们意识到这一点时,修复数据将是一个真正的痛苦……可能足够痛苦以至于它会更有意义只是为了首先做我现在正在做的事情)。
解决方案
SQL Server 2012 引入了SEQUENCE
数据库对象的概念——类似于“身份”列,但与表分开。
您可以从您的代码中创建和使用序列,您可以在不同的地方使用这些值,等等。
有关更多信息,请参阅这些链接:
推荐阅读
- ssl - Nagios check_cert - 严重 - 无法建立 SSL 连接
- react-native - 是否可以使用组件顶部的关闭按钮打开错误屏幕?
- c++ - 输出文件在位图的文件末尾缺少填充。为什么是这样?
- c# - 我真的必须创建多个模型吗?
- python - 如何找到圆与矩形相交的间隔
- apache-spark - Spark JobServer 可以使用 Cassandra 作为 SharedDb
- android - ConstraintLayout 防止顶部和底部小部件重叠
- angular - 如何翻译表格数据中的原始 HTML 代码
- python - __init__ 和 __str__ 来处理文件
- python - 无法加入熊猫中的数据框