Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL表设计-标识列_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL表设计-标识列

SQL表设计-标识列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,SQLServer2008数据库问题 我有两个表,分别称为Customers和Users,其中单个客户可以有1到n个用户。Customers表生成一个CustomerId,该ID是一个种子标识,其增量为+1。在Users表中,我想要的是一个由CustomerId和序列号组成的复合键,这样在所有情况下,第一个用户的序列号都是1,后续用户的序列号都是x+1 所以这张桌子看起来像这样 客户ID(主键,FK) 用户标识(PK) 名字 …例如,如果客户485有三个客户,则数据将看起来像 Custome

SQLServer2008数据库问题

我有两个表,分别称为Customers和Users,其中单个客户可以有1到n个用户。Customers表生成一个CustomerId,该ID是一个种子标识,其增量为+1。在Users表中,我想要的是一个由CustomerId和序列号组成的复合键,这样在所有情况下,第一个用户的序列号都是1,后续用户的序列号都是x+1

所以这张桌子看起来像这样

  • 客户ID(主键,FK)
  • 用户标识(PK)
  • 名字
…例如,如果客户485有三个客户,则数据将看起来像

CustomerId  |  UserId  |  Name  
----------
  485  |  1  |  John  
  485  |  2  |  Mark  
  485  |  3  |  Luke  
我很感激我可以手动为UserId添加1,2,3,…,n条目,但是我希望在SQL中插入行时自动执行此操作,因此,在所示的示例中,我可以有效地插入带有CustomerId和SQL Server保护标识的名称等的行。有没有办法通过数据库设计本身做到这一点?当我将UserId设置为标识时,它会在所有客户中运行1到无穷大,这不是我要寻找的-我的设置是否有误在某个地方,或者这不是一个选项


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

我想不出任何自动方法来实现这一点,除非实现一个自定义存储过程来插入行并检查以适当地增加Id,尽管其他有更多知识的人可能会有更好的主意

然而,在我看来,这意味着加入代理密钥——这并不总是一个好主意

更多信息请点击此处:


如果不实现一个自定义存储过程来插入行并检查以适当地增加Id,我想不出任何自动方法来实现这一点,尽管其他有更多知识的人可能会有更好的想法

然而,在我看来,这意味着加入代理密钥——这并不总是一个好主意

更多信息请点击此处:


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

最简单的方法是让触发器从users表中为插入的记录上的客户id选择最大用户id,然后向其中添加一个。但是,如果有多个人同时创建用户记录,则会遇到并发问题

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

  • 开始一项交易
  • 增加客户的NextUserID(锁定行)
  • 选择更新的下一个用户id
  • 将其用于新用户记录
  • 提交事务
  • 这应该确保同时添加用户不会导致同一用户id被多次使用


    尽管如此,我还是建议你不要这样做。这比它的价值更麻烦,而且一开始就闻起来是个坏主意

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

    最简单的方法是让触发器从users表中为插入的记录上的客户id选择最大用户id,然后向其中添加一个。但是,如果有多个人同时创建用户记录,则会遇到并发问题

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

  • 开始一项交易
  • 增加客户的NextUserID(锁定行)
  • 选择更新的下一个用户id
  • 将其用于新用户记录
  • 提交事务
  • 这应该确保同时添加用户不会导致同一用户id被多次使用


    尽管如此,我还是建议你不要这样做。这比它的价值更麻烦,而且一开始就闻起来是个坏主意

    因此您需要一个生成的user\u id字段,该字段在customer\u id的范围内递增

    我想不出有哪一个数据库存在这种概念

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

    代理键应该没有任何意义。为什么您要尝试制作一个同时是代理项并暗示顺序的键

    我的建议是:

  • 创建日期\创建的字段,默认为getDate()。这将允许您了解每个用户id的创建顺序(基于时间)

  • 创建一个序号字段-可以通过触发器进行更新,以支持该顺序


  • 希望这会有所帮助。

    因此,您希望生成一个在客户id范围内递增的用户id字段

    我想不出有哪一个数据库存在这种概念

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

    代理键应该没有任何意义。为什么您要尝试制作一个同时是代理项并暗示顺序的键

    我的建议是:

  • 创建日期\创建的字段,默认为getDate()。这将允许您了解每个用户id的创建顺序(基于时间)

  • 创建一个序号字段-可以通过触发器进行更新,以支持该顺序


  • 希望能有帮助。

    我很困惑。您是否希望标识列在每次插入行时自动递增?在用户表中,是-但对于每个不同的客户,始终以1作为种子。如果我将UserId设置为一个标识列(作为CustomerId复合键的一部分),它似乎会无限增加。对不起,我觉得这很难解释!我很困惑。您是否希望标识列在每次插入行时自动递增?在用户表中,是-但对于每个不同的自定义项,始终以1作为种子