2017-10-10 78 views
0

我想插入一條記錄像下面如何在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 

回答

0

你有ID,RequestNo vendorCode的定義PK - 因此您提到的示例不被視爲重複。但是,從PK中刪除ID並且它應該可以正常工作。由於ID由身份填充,這應該不成問題。如果由於某種原因或其他原因需要通過identity_insert插入數據,我建議只爲ypur表格添加一個唯一的關鍵字來覆蓋列ID。

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作爲主鍵的一部分。

0

您正在嘗試編制一個複合主鍵。 組合主鍵強制使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] 
0

的複合密鑰應用的唯一值的3列的組合,而不是每個單獨的列(1,約翰,1011)是從(2,邁克爾,1011)是唯一的。如果你希望它也是唯一的,你需要在RequestNo列上添加一個唯一的密鑰。在一個側面說明有varchar數據類型作爲一個PK並不總是一個好主意,並且可以RequestNo不是一個int?

相關問題