SQL表设计 - 标识列

时间:2009-11-03 20:30:24

标签: sql sql-server sql-server-2008

SQL Server 2008数据库问题。

我有2个表,为了参数起见,称为客户和用户,其中一个客户可以拥有1到n个用户。 Customers表生成一个CustomerId,它是一个带有+1增量的种子标识。我在Users表中所看到的是一个复合键,它包含CustomerId和序列号,这样在所有情况下,第一个用户的序列为1,后续用户在x + 1处添加。

所以表格看起来像这样......

  • CustomerId(PK,FK)
  • UserId(PK)
  • 名称

...例如,如果客户485有三个客户,那么数据看起来就像......

CustomerId  |  UserId  |  Name  
----------
  485  |  1  |  John  
  485  |  2  |  Mark  
  485  |  3  |  Luke  

我很欣赏我可以为UserId手动添加1,2,3,...,n条目但是我想在SQL中的行插入时自动发生这种情况,因此在显示的示例中我可以有效地插入带有CustomerId的行和带有SQL Server的Name保护身份等等。有没有办法通过数据库设计本身来做到这一点 - 当我将UserId设置为身份时,它在所有客户中运行1到无穷大,这不是我的我正在寻找 - 我在某个地方设置错了,或者这不是一个选择?

希望有意义 - 感谢您的帮助

3 个答案:

答案 0 :(得分:4)

如果没有实现插入行的自定义存储过程并检查以适当地增加Id,我可以想到没有自动的方法来实现这一点,而更多知识的其他人可能有更好的想法。

然而,这让我觉得使代理键自然化 - 这并不总是一个好主意。

更多信息:

http://www.agiledata.org/essays/keys.html

答案 1 :(得分:1)

对于常规标识列,这不是一个真正的选项,但您可以设置插入触发器来自动填充用户ID。

执行此操作的简单方法是让触发器从users表中为插入记录上的customer id选择max user id,然后为其添加一个。但是,如果有多个人同时创建用户记录,那么你会遇到并发问题。

更好的解决方案是在customers表上有一个NextUserID列。在您的触发器中,您将:

  1. 开始交易。
  2. 为客户增加NextUserID(锁定行)。
  3. 选择更新的下一个用户ID。
  4. 将其用于新用户记录。
  5. 提交交易。
  6. 这应该确保同时添加用户不会导致多次使用相同的用户ID。

    所有这一切,我建议你不要这样做。这比它的价值更麻烦,开始时只是一个坏主意。

答案 2 :(得分:1)

因此,您希望生成的user_id字段在customer_id的范围内递增。

我无法想到存在该概念的一个数据库。

您可以使用触发器实现它。但我的问题是:为什么?

代理键应该没有任何意义。为什么你会试图制作一个同时代替并暗示秩序的钥匙?

我的建议:

  1. 创建一个date_created字段,默认为getDate()。这将允许您了解创建每个user_id的顺序(基于时间)。

  2. 创建一个序数字段 - 可以通过触发器更新,以支持该订单。

  3. 希望有所帮助。