Sql server 列为c1 int和c2 int的复合键,其中c2与每个c1的单独一系列值相同

Sql server 列为c1 int和c2 int的复合键,其中c2与每个c1的单独一系列值相同,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,假设我们有一个带有订单表的网店 它具有复合密钥 OrderID int, ShopID int 如果我 我希望订单包含: OrderID ShopID 1 3 然后 insert into Orders (ShopID) values (4) 它应该包含 OrderID ShopID 1 3 1 4 OrderID ShopID 1 3 1 4 2 3 如

假设我们有一个带有订单表的网店

它具有复合密钥

OrderID int, ShopID int
如果我

我希望订单包含:

OrderID ShopID
      1      3
然后

insert into Orders (ShopID) values (4)
它应该包含

OrderID ShopID
      1      3
      1      4
OrderID ShopID
      1      3
      1      4
      2      3
如果我

插入订单(ShopID)值(3)

它应该包含

OrderID ShopID
      1      3
      1      4
OrderID ShopID
      1      3
      1      4
      2      3
无需手动尝试插入记录,例如,增加OrderID

我之所以认为这个解决方案是一种黑客行为,是因为当我只有一个列时,我不必手动插入记录,也没有逻辑上的理由,我应该根据我的特定需求求助于这种解决方案

我使用的是T-SQL,我在irc上听到一些传言,说它的某个版本实际上支持这个,但我不知道用哪种方式


问题当然延伸到其他RDBM:s.

您所要求的是SQL Server无法提供的东西。现在,如果OrderID是一个标识,那么您将获得一个get a autoincrement字段,这样每次插入都将生成一个新的订单ID。如果这不是您想要的,并且您实际上只希望OrderID根据其他一些规则递增,那么您就不走运了-您需要使用业务逻辑并手动管理递增

应该避免后一种情况:手动跟踪和决定何时更新容易出现争用或串行访问(基本上,如果两个线程同时执行
SET@NewOrderID=(选择MAX(OrderID)+1)
,它们将得到相同的结果)。
IDENTITY
可能是更好的答案-不清楚为什么您希望每个商店都有自己的订单ID

关于“我听到了一些谣言…”,我想知道这是否是带有PARTITION BY子句的ROW_NUMBER()。这对您没有帮助:虽然您可以使用SELECT语句根据给定列重新启动计数器,但这是动态的,无法保证在查询1上生成的行号在下一次查询中相同,具体取决于行的插入方式和查询方式(如果严格控制行的插入方式,则可以保证—但这是一项业务规则,SQL Server无法强制执行)