如何在SQL Server中创建一个包含2个主键的表?

时间:2017-10-10 08:24:34

标签: sql sql-server stored-procedures

我想插入如下记录

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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我相信您只需要在表定义中使用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 :(得分:0)

您正在尝试制作复合主键。 Composite主键强制使Prime属性(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 :(得分:0)

复合键为3列的组合应用唯一值,而不是每列(1,John,1011)都是唯一的(2,Michael,1011)。如果您希望它也是唯一的,您需要在RequestNo列上添加唯一键。另外,将varchar数据类型作为PK并不总是一个好主意,并且RequestNo不能是int吗?