【问题标题】:Auto-increment int column BUT also allow manual input? Can't use primary key自动增量 int 列但也允许手动输入?不能使用主键
【发布时间】:2013-05-30 19:13:04
【问题描述】:

我们的团队正在为某个组织开发一个新系统。 我们有一个Client 表:

Id (PK), int, not null
NoClient, int, not null

该组织通常通过其号码NoClient 来指代客户。慢慢地,旧系统的客户端将(手动)迁移到新系统。

NoClient 应该是自动递增的(对于新客户端 | 新系统的功能),同时允许手动输入(对于现有客户端)并且以后不会导致冲突。

视觉上,从自增列的角度来看:

..., 9998, 9999, (used), 10001, 10002

知道如何利用 SQL Server 2005(或实体框架)来解决这个问题吗?

可能必须创建种子表并使用存储过程(嵌入逻辑),除非有更好的方法来执行此操作...

【问题讨论】:

  • 只需以高于现有最大 NoClient 的数字为新客户启动身份。您可以使用 set identity_insert on 覆盖 iden insert。

标签: c# .net entity-framework sql-server-2005


【解决方案1】:

你可以试试SET IDENTITY_INSERT ON

【讨论】:

  • 来自 MSDN:允许将显式值插入到表的标识列中。我基本上需要NoClient 列的序列号生成器,它不是标识列。
  • 你为什么不想使用身份?
  • Id (PK) 是标识列。此外,如果用户输入 2147483647,它将在下一次插入时中断。来自 MSDN:如果插入的值大于表的当前标识值,SQL Server 会自动使用新插入的值作为当前标识值。
  • @maxbeaudoin 你说为现有的保留点。这意味着你必须知道现有的。你真的有一个现有的客户 2147483647。
  • @Blam 我愿意...无法判断它是否是垃圾,但它就在那里。对客户数据库进行查询MAX(NoClient)
【解决方案2】:

你的问题不是很清楚。

有一个 bool 列处于活动状态。使用列 false 加载所有现有的。然后在客户迁移时打开它。

至于找漏洞。

select min(tb1.PK) + 1 
from table tb1 
left outer join table tb2 
on tb2.pk = tb1.pk + 1 
where tb2.pk is null 

【讨论】:

  • 你建议我如何提高问题的清晰度?
  • 如果这不是答案,那么我不清楚这个问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多