SQL Server中如何创建带唯一ID的Customer表以支持并发填充操作?
问题核心澄清
你对需求的理解出现了偏差,你老板提到的「表具备唯一ID支持多实例并发」,既不是表本身的全局唯一标识符,也不是你第一反应的行级主键:
- 行级主键只能保证单条数据的唯一性,解决不了多实例并发写入的识别问题:两个
PopulateCustomers实例同时运行写入数据时,你没有办法区分哪些数据属于哪个运行实例,后续做实例级的数据校验、回滚、清理操作时会直接影响其他实例的正常数据,这也是你老板否定行主键方案的原因。 - 你之前搜到的临时表创建语句
CREATE TABLE #temp(id INT)属于行级标识的用法,和本次需求的实例批次标识逻辑不同,但核心思路都是通过新增标识字段区分数据,只是标识的业务维度不一样。 - 这个需求本质是要你在
Customer表中新增一个实例批次唯一标识字段,用来标记每行数据来自哪一个存储过程运行实例。
可搜索的关键词
你可以用以下关键词搜索相关实现方案:
- SQL 并发写入 批次标识字段设计
- SQL 多存储过程实例写入 数据隔离
- SQL Server 批量数据写入 会话标识列
基础实现逻辑(供你自行研究参考)
- 先梳理
PopulateCustomers存储过程的调用逻辑,确认每个运行实例是否有已有的唯一标识(比如业务批次号、会话变量、执行上下文ID),如果没有可以直接在存储过程开头生成GUID作为本次实例的唯一ID - 在设计
Customer表时新增一个BatchUniqueID字段,类型可选择UNIQUEIDENTIFIER或者INT(如果有专门的批次管理表的话可以关联批次表的自增主键) - 修改存储过程写入逻辑,将本次实例的唯一ID统一写入所有本次生成的
Customer行的BatchUniqueID字段中
这样设计后,多个实例同时写入时数据天然可区分,实例级别的操作只需要按BatchUniqueID过滤即可,不会互相干扰。
内容的提问来源于stack exchange,提问作者user16405900
相关产品推荐
相关产品推荐

