1

假设我们有一个带有表 Orders 的网上商店。

它具有复合键

OrderID int, ShopID int

如果我

insert into Orders (ShopID) values (3)

我希望订单包含:

OrderID ShopID
      1      3

接着

insert into Orders (ShopID) values (4)

它应该包含

OrderID ShopID
      1      3
      1      4

如果我

插入订单 (ShopID) 值 (3)

它应该包含

OrderID ShopID
      1      3
      1      4
      2      3

无需手动尝试插入记录,例如增加 OrderID

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/792a5b82-2d13-46bd-8650-a75a74ea222f/composite-primary-key-with-auto-increment-column

我认为这个解决方案是一种 hack 的原因是,当我只有一个列时,我不必手动插入记录,而且没有任何合乎逻辑的理由我应该根据我的特定要求诉诸这种解决方案。

我正在使用 T-SQL,我在 irc 上听说过一些关于它的某些版本实际上支持这一点的谣言,但我不知道以哪种方式。

这个问题当然延伸到其他 RDBM:s。

4

1 回答 1

3

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

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

就“我听说过一些谣言......”而言,我想知道这是否是带有 PARTITION BY 子句的 ROW_NUMBER() 。这在这里对您没有帮助:虽然您可以让 SELECT 语句根据给定列重新启动计数器,但这是动态的,并且无法保证在查询 1 上生成的行号与下一个查询相同,取决于行的插入方式和查询方式(如果您严格控制行的插入方式,那么您可以保证 - 但这是一个业务规则,SQL Server 无法强制执行)。

于 2013-08-19T07:43:17.240 回答