【问题标题】:How to set (combine) two primary keys in a table如何在表中设置(组合)两个主键
【发布时间】:2012-07-19 16:36:33
【问题描述】:

对于一个小型销售相关的应用程序,我们使用逻辑数据模型设计了数据库。上台转换成实体模型。在 SQL Server Management Studio Express 中创建表时,根据我们的逻辑数据模型,我们需要将两个属性结合起来形成唯一的 id。是否可以组合两个主键并设置它?

但是在观察 Northwind Sample 时,我们发现在ORDER DETAILS 表中,我们可以看到两个主键Order IdProduct Id。并且根据规则表不能有两个主键。那么它是如何在北风发生的呢?

在我的情况下,我应该如何在我的表中设置两列以使其成为两个主键?

有人提出了类似的建议

要创建两个主键,请在设计视图中打开表格并单击 在两个必填字段上并持有 CTL,应用主键

这行得通吗??

编辑;

现在我的桌子在 SSMS 中有 2 个 PK。它是有效的还是只是2个pks的组合

【问题讨论】:

  • 您的表只能有 一个 主键 - 您可能是指有一个包含两列的主键 - 对吧?
  • 我认为您的意思是“复合主键”而不是“两个主键”。在 Northwind 中,订单 ID 在订单详细信息中不是唯一的,产品 ID 也不是唯一的。这种组合是独一无二的。我想你已经知道了,但你的措辞并不明显。
  • @marc_s 我刚刚附上了问题中表格的屏幕截图,它只是2个键的组合吗??
  • 是的,这只是一个键中两列的组合。
  • @AaronBertrand 那么如何在 SQL 中使用它呢?例如在 "Select * from Stack where _____? 中如何使用这个组合

标签: ssms sql-server-express database composite-primary-key


【解决方案1】:

最简单的方法是在 SSMS Express 中使用 T-SQL 命令,而不是尝试使用可视化设计器.....

一旦您设计并创建了表格,请尝试以下操作:

ALTER TABLE dbo.YourTableNameHere
ADD CONSTRAINT PK_YourTableNameHere
PRIMARY KEY(Item_Id, Purchase_Id)

【讨论】:

  • 那么如何在 SQL 中使用它??例如在“Select * from Stack where _____? 中。如何使用这种组合 –
  • @panindra:像往常一样使用你的常规 SQL - 仅仅因为主键有两列根本不会改变任何东西.....SELECT (list of cols) FROM dbo.Stack WHERE ...(whatever condition you need here)...
  • 您的意思是说我可以使用 Where to identify the row 中的组合键之一,或者我可以使用组合键。是吗??
  • @panindra:你可以使用任何你喜欢的来搜索!没有理由您必须只使用主键列进行搜索……或者您不确定什么?主键只是定义 这两列的组合 可以唯一且安全地标识每个单独的行 - 没有两行会有 相同的组合 (Item_Id, Purchase_Id) -这就是所有主键强制...
  • @panindra:如果您需要找到由Item_IdPurchase_Id 定义的那一行,那么您只需使用SELECT (cols) FROM dbo.Stack WHERE Item_Id = 4711 AND Purchase_Id = 501992 或任何您需要的东西......因为这两列一起是主键,则保证您要么一无所获(如果该值组合不存在),要么您获得 唯一一行 与这两个值匹配。这两个值NEVER可以多于一行。
【解决方案2】:

您不能在一个表中创建两个主键。您可以将表中的两列合并为一个主键

create table table1
(
col1 int,
col2 varchar(20),
....
Primary key (col1, col2)
)

【讨论】:

    【解决方案3】:

    你不能有 2 个主键,但你可以有一个复合主键,这是一个由两列组成的键,这正是你在 [SalesOrderDetail] 表中得到的具有 [SalesOrderID] 和 [SalesOrderDetailID] 的内容

    【讨论】:

      【解决方案4】:
      CREATE TABLE [dbo].[tab2](  
          [col1] [int] NOT NULL, 
          [col2] [int] NOT NULL, 
          [col3] [nchar](10) NOT NULL,  
          [col4] [nchar](10) NOT NULL,   
       CONSTRAINT [PK_tab2] PRIMARY KEY CLUSTERED    
      (  
          [col1] ASC, 
          [col2] ASC 
      )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
      ) ON [PRIMARY] 
      

      【讨论】:

      • 欢迎使用 StackOverflow:如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行并单击“代码示例”按钮 ({ } ) 在编辑器工具栏上很好地格式化和语法高亮它!那么你也不需要那些乱七八糟的<p><br/> 标签了!
      猜你喜欢
      • 1970-01-01
      • 2012-03-29
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多