在Microsoft SQL Server中使用复合键

Sni*_*itz 5 sql-server unique-constraint

我有一个具有以下结构的SQL表:

在此输入图像描述

我希望此表的工作方式是,如果表中输入的项具有相同的名称和类型,则它只是重复项,以便下面的示例在将这两个项添加到数据库时有效.

Item 1:
Name: MILE50
Acronym: MS50
Type: PRE
Color: white
Run Code Online (Sandbox Code Playgroud)
Item 2:
Name: MILE50
Acronym: MS50
Type: SYS
Color: white
Run Code Online (Sandbox Code Playgroud)

目前,如果我输入数据如图所示,则会导致错误,指出存在违反主键约束的错误.我是否误解了复合键在SQL中的工作原理?如果是这样,我怎么能实现我正在寻找的东西?

非常感谢.

编辑:更新的SQL脚本

    USE [ProjectPlannerDatabase]
GO

/****** Object:  Table [dbo].[MilestoneCategory]    Script Date: 14/12/2015 14:55:04 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[MilestoneCategory](
    [Name] [varchar](200) NOT NULL,
    [Acronym] [varchar](200) NOT NULL,
    [Type] [varchar](20) NOT NULL,
    [Color] [varchar](200) NOT NULL,
 CONSTRAINT [PK_MilestoneCategory] UNIQUE NONCLUSTERED 
(
    [Name] ASC,
    [Type] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[MilestoneCategory]  WITH CHECK ADD  CONSTRAINT [FK_MilestoneCategory_MilestoneClass] FOREIGN KEY([Type])
REFERENCES [dbo].[MilestoneType] ([Name])
GO

ALTER TABLE [dbo].[MilestoneCategory] CHECK CONSTRAINT [FK_MilestoneCategory_MilestoneClass]
GO
Run Code Online (Sandbox Code Playgroud)

执行以下脚本只提供一个条目:

  Name   Acronym Type Color
1 MILE50 MS50    PRE  white

USE [ProjectPlannerDatabase]
GO

SELECT [Name]
      ,[Acronym]
      ,[Type]
      ,[Color]
  FROM [dbo].[MilestoneCategory]
  WHERE Name='MILE50'
  AND Acronym='MS50'
GO
Run Code Online (Sandbox Code Playgroud)

Jes*_*ess 3

要强制 2 列的唯一性,您可以添加如下所示的唯一约束:

ALTER TABLE dbo.MilestoneCategory
ADD CONSTRAINT constraint_name 
UNIQUE NONCLUSTERED (Name,Type);
Run Code Online (Sandbox Code Playgroud)

PS:我认为你应该只有一个主键,即示例记录中的 Item 。您可以将 MilestoneCategoryID 添加为 int, Identity column

有关独特约束的更多详细信息,请参阅此答案。