【问题标题】:How to create a table with 2 primary key in SQL Server? [duplicate]如何在 SQL Server 中创建具有 2 个主键的表? [复制]
【发布时间】:2017-10-10 23:33:24
【问题描述】:

我想插入如下记录

ID  VendorName  RequestNo   VendorCode  ChequeDateSearch         Description    StoreID
-------------------------------------------------------------------------------------
1   John        1011        1021        2017-10-25 00:00:00.000         descr       6000
2   michael     1011        1022        2017-10-25 00:00:00.000         descr       6000
3   Abraham     1011        1023        2017-10-25 00:00:00.000         descr       6000

注意

它不应该接受重复的VendorCode 与相同的RequestNo

在我的表中 ID,RequestNoVendorCode 应该是主键。 ID 是自动递增,RequestNoVendorCode 是用户指定的

CREATE TABLE [dbo].[CheqVendorSearch](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [VendorName] [nvarchar](max) NULL,
    [RequestNo] [varchar](50) Not NULL,
    [VendorCode] [varchar](50) NOT NULL,
    [ChequeDateSearch] [datetime] NULL,
    [Description] [nvarchar](max) NULL,
    [StoreID] [varchar](10) NULL,
PRIMARY KEY CLUSTERED 
(
    [ID] ASC,
    [RequestNo] ASC,
    [VendorCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

但此表接受 RequestNoVendorCode 的副本,如下所示

ID  VendorName  RequestNo   VendorCode  ChequeDateSearch         Description    StoreID
-------------------------------------------------------------------------------------
1   John        1011        1023        2017-10-25 00:00:00.000         descr       6000
2   michael     1011        1023        2017-10-25 00:00:00.000         descr       6000
3   Abraham     1011        1023        2017-10-25 00:00:00.000         descr       6000

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    我相信您只需要在表定义中使用UNIQUE 约束。

    CREATE TABLE [dbo].[CheqVendorSearch](
        [ID] [bigint] IDENTITY(1,1) PRIMARY KEY NOT NULL,
        [VendorName] [nvarchar](max) NULL,
        [RequestNo] [varchar](50) Not NULL,
        [VendorCode] [varchar](50) NOT NULL,
        [ChequeDateSearch] [datetime] NULL,
        [Description] [nvarchar](max) NULL,
        [StoreID] [varchar](10) NULL,
        CONSTRAINT UQ_vendor_request UNIQUE
        (
            [RequestNo] ,
            [VendorCode] ASC
        )
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    

    您的解决方案中的主要问题是每一行都由ID 唯一标识,因此将RequestNoVendorCode 作为主键的一部分是没有用的。

    【讨论】:

      【解决方案2】:

      您正在尝试创建一个复合主键。 复合主键强制使 Prime Attribute(ID、RequestNo 和 VendorCode)的组合是唯一的。要使 RequestNo 和 VendorCode 也唯一,您必须在两者上添加 Unique Clause。

      CREATE TABLE [dbo].[CheqVendorSearch](
      [ID] [bigint] IDENTITY(1,1) NOT NULL,
      [VendorName] [nvarchar](max) NULL UNIQUE,
      [RequestNo] [varchar](50) Not NULL UNIQUE,
      [VendorCode] [varchar](50) NOT NULL,
      [ChequeDateSearch] [datetime] NULL,
      [Description] [nvarchar](max) NULL,
      [StoreID] [varchar](10) NULL,
      PRIMARY KEY CLUSTERED 
      (
          [ID] ASC,
          [RequestNo] ASC,
          [VendorCode] ASC
      )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
      ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
      

      【讨论】:

        【解决方案3】:

        您使用 ID、RequestNo 和 VendorCode 定义 PK - 因此您提到的示例不被视为重复。但是,从 PK 中删除 ID,它应该可以正常工作。由于ID由身份填充,这应该没有问题。如果出于某种原因您必须通过 identity_insert 插入数据,我建议向 ypur 表添加一个唯一键,仅覆盖列 ID。

        【讨论】:

          【解决方案4】:

          复合键为 3 列的组合应用唯一值,而不是每一列单独 (1,John,1011) 与 (2,Michael,1011) 是唯一的。如果您希望它也是唯一的,则需要在 RequestNo 列上添加一个唯一键。附带说明一下,将 varchar 数据类型作为 PK 并不总是一个好主意,RequestNo 可以不是 int 吗?

          【讨论】:

            猜你喜欢
            • 2015-07-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-24
            • 2012-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多