如何在SQL Server中使用2个主键创建表?

问题描述:

我想插入一条记录像下面如何在SQL Server中使用2个主键创建表?

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 

注意

它不应该接受相同RequestNo

重复VendorCode我的表IDRequestNoVendorCode应成为主键。 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] 

但该表受理RequestNo和重复VendorCode像下面

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 

你有ID,RequestNo vendorCode的定义PK - 因此您提到的示例不被视为重复。但是,从PK中删除ID并且它应该可以正常工作。由于ID由身份填充,这应该不成问题。如果由于某种原因或其他原因需要通过identity_insert插入数据,我建议只为ypur表格添加一个唯一的关键字来覆盖列ID。

我相信你只需要你的表定义中的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作为主键的一部分。

您正在尝试编制一个复合主键。 组合主键强制使Prime属性(ID,RequestNo和VendorCode)的组合是唯一的。为了使RequestNo和VendorCode也是唯一的,你必须在它们两个上添加唯一条款。

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列的组合,而不是每个单独的列(1,约翰,1011)是从(2,迈克尔,1011)是唯一的。如果你希望它也是唯一的,你需要在RequestNo列上添加一个唯一的密钥。在一个侧面说明有varchar数据类型作为一个PK并不总是一个好主意,并且可以RequestNo不是一个int?