2013-05-30 34 views
0

Client表:如何设计自动增量字段,同时允许手动用户输入?

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

形式(线框):

enter image description here

  • 字段NoClient应为数字
  • 字段NoClient应该是唯一的
  • 的如果为空,则应该自动生成NoClient字段
  • 领域NoClient仅供参考
  • 场NoClient不是主键
  • 场NoClient没有标识列

如何解决这一问题SQL明智?

编辑。我说的是NoClient列,而不是ID

+0

将另一列添加到您的表格中。数据库不允许这个原因。 – evanmcdonnal

+2

使其可以为空,如果它为空,则添加一个插入触发器来填充它。 – Blorgbeard

+0

为什么你想让用户设置PK?他们如何知道该号码是否已被使用? – Oscar

回答

4

严格解释这些规则,没有解决方案。其中一条规则要么不正确,要么不准确。你不能用AFTER触发器解决它,因为你不能尝试在数字字段中插入一个空格,也不能用BEFORE触发器。你也不能使用默认值。

现在,如果你的意思是“什么时候留空”意思是“什么时候留空”,那么你可以用一个非常精心制作的BEFORE TRIGGER来解决它。 (或者一个AFTER TRIGGER,如果你可以把这个字段改为一个空的int)

如果你的意思是“当留空时”意味着你没有在插入/更新中提到该列,那么你可能会通过精心设计的默认设置,通过将通过NewID的呼叫转换为GUID到一个非常大的数字。作为一个便笺,我会告诉设计师回去重新设计它,因为无论您最终提出什么样的解决方案,它都不是很具有伸缩性,并且PITA可以正确执行。您必须基本锁定整个表格(从读取和写入),执行整个表格/索引扫描以确保您创建的值为UNIQUE。您可能应该使用ID字段作为客户端号码,可能会使用不以0开头的内容进行播种。

+0

我同意。非常。 – maxbeaudoin

+1

我想你可以创建第二个表,它只有一个标识,并且在'before trigger'期间(我假设你可以做到这一点),向它插入一行,检索最后创建的标识,并将其分配给clientno字段,并为尝试插入的每一行执行此操作。可能比专门锁定客户端表更好。或者让设计师将clientno设为可空字段,然后在“AFTER TRIGGER”中执行,这样会更好。 –

0

首先执行一个查询到SET IDENTITY OFF,插入您的ID,然后再次设置IDENTITY ON。

相关问题