【问题标题】:SQL Server 2008: how to design a table with 2 primary keys and ID with autoincrement related to 1 key valueSQL Server 2008:如何设计具有 2 个主键和 ID 的表,其自动增量与 1 个键值相关
【发布时间】:2013-03-15 07:26:00
【问题描述】:

让我稍微解释一下:我需要设计一个需要安装在不同位置(可能相互连接或不相互连接)的数据库。

我的想法是:我为什么不使用一个列,其中我将有关位置(站点)的信息作为键,并且我有另一个包含记录 ID 的字段?例如,我需要有一个 Customers 表,其中有一个 customer_id 和一个 site_id 列。

但我知道我不能在一个表中创建多个具有自动增量的标识列。我最终想到的是:有没有办法只有一个身份列但与另一列相关?

例如,如果我可以有这样的客户表,那就太好了:

site_id cust_id description
1        1       John Doe
1        2       Joseph White
1        3       Carlos Santana
2        1       Mike Jones
2        2       Carl Johnson

cust_id 必须具有自动增量。

提前谢谢你

【问题讨论】:

  • 您不能有多个主键 - 但您可能真的是指 一个 主键,其中包含 两个 列 - 对吧?
  • 对马克。请参阅上面的示例...

标签: sql sql-server primary-key identity auto-increment


【解决方案1】:

我有一个更好的建议:如果您只需要每边的数字是唯一的,为什么不这样做呢?在您的设计中,您需要在表的每一行中重复值 1。这对我来说似乎很浪费。相反,请尝试提供身份范围:

在站点 1:

CREATE TABLE dbo.Customers
(
  CustomerID BIGINT IDENTITY (1000000000,1)
  , other columns...

在站点 2:

CREATE TABLE dbo.Customers
(
  CustomerID BIGINT IDENTITY (2000000000,1)
  , other columns...

现在,您不仅几乎可以保证永远不会重复创建(除非您以惊人的惊人速度创建客户),而且您还可以立即知道客户是在哪里创建的。

【讨论】:

  • 这是一个分发此解决方案的 PITA...我需要为我添加的每个站点手动创建不同的数据库...
  • @user1648502 不,你没有。您对没有数据的第一个版本进行备份(您可以使用任何合适的模式/数据比较工具构建这样的东西),在新服务器上恢复它,然后为该服务器的身份池运行 DBCC CHECKIDENT。也很容易自动化,根本不是 PITA。你会多久做一次?你真的认为这比在表的每一行中存储 1、2 等,并处理与数据完全无关的复合主键更糟糕吗?
【解决方案2】:

您可以在两列上创建 PK


create table customers (CustomerRegion int not null,
                       CustomerID int identity(1000,1) not null,
                       primary key (CustomerRegion,CustomerID)
                      )

【讨论】:

  • 这不是我想要实现的...... ID 自动增量不依赖于 customerRegion。如果您进行插入,则无论区域代码是什么,自动增量都会不断添加。如果 customerRegion 不同或新,我需要从 1000 开始(在您的示例中):请参阅我的示例。无论如何,谢谢。
【解决方案3】:

听起来您想要一个复合主键(请参阅此处的MSDN docs)。

这没什么大不了的,但以后可能会是一个皇家痛苦。 (多个主键字段加入很麻烦)

【讨论】:

  • 同意。几乎每个查询都必须附带那个“额外”列。
猜你喜欢
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-03
  • 2018-10-17
相关资源
最近更新 更多