如何在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
我的表ID
,RequestNo
和VendorCode
应成为主键。 ID
是自动递增,以及RequestNo
和VendorCode
是用户指定
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
确定,因此,它是没用的,有RequestNo
和VendorCode
作为主键的一部分。
答
您正在尝试编制一个复合主键。 组合主键强制使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?