【问题标题】:SQL-Server: Create table with integer as id (primary key), but without autoid/autoincrement?SQL-Server:使用整数作为 id(主键)创建表,但没有 autoid/autoincrement?
【发布时间】:2013-01-28 09:59:18
【问题描述】:

问题:

在 SQL-Server 中,是否可以将整数(不是 GUID)作为 ID(主键),但 不使用 AutoID/AutoIncrement,这样我可以在以下情况下手动设置 ID我必须这样做,而不会在多线程环境(Web 应用程序)中遇到麻烦?

如果是这样,如果我必须连续插入两行以上,并且没有给出主键,我该如何设计生成插入 ID 的函数,以便它是线程安全的,而我没有为 2+ 插入/记录获取相同的 id ?

【问题讨论】:

  • 虽然完全有可能拥有不是身份的 PK,但您已经描述了身份听起来很理想的情况 - 您有不能使用它的原因吗?
  • @Bridge:现在,我需要定期删除并重新导入用户表。如果有人在我删除后插入新用户,它应该分配一个具有下一个最高值的新 id,如果我重新导入旧用户,它应该将相同的 ID 重新分配给同一个用户。现在,我必须关闭/打开身份插入,然后它会在身份插入切换期间中断新用户在 Web 应用程序中的插入。
  • @Quandary - 实际上,您必须打开身份插入 on (设置的意义是“我要插入一个身份值”) - 它只是影响设置选项的连接 - 它不应该影响其他连接,例如网络应用程序。
  • 也许您不应该删除用户表,而是在导入过程中更新现有用户。 “插入重复密钥更新”在这里可能会有所帮助。虽然,显然您正在使用两个不同的来源从(导入和直接插入)获取用户信息。如果两者都依赖于“自动编号”ID,则结果将是不可预测的。也许考虑从实际数据(例如“用户名”)构造一个主键

标签: sql multithreading sql-server-2008 tsql sql-server-2005


【解决方案1】:

我不确定您是否不能为此使用增量标识,但您可以使用 UNIQUEIDENTIFIER 模拟唯一键。

PRINT CONVERT( BIGINT, CONVERT( VARBINARY, NEWID() ) )

基本上,这向您展示了如何将 uniqueidentifier (NEWID()) 转换为 bigint。因此,您将能够实现您想要的结果,但将其放入一个函数中。

【讨论】:

  • 因为GUID 是16 字节,BIGINT 是8 字节,所以你会发生冲突。
  • 嗯..你是对的!经过一番思考,嘿,为什么不能使用 UNIQUEIDENTIFIER?你可以得到想要的结果。
  • @Joseph:因为在 100 个表中已经存在引用该整数的数据。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多