Sql server 在Microsoft SQL Server中使用复合密钥

Sql server 在Microsoft SQL Server中使用复合密钥,sql-server,unique-constraint,Sql Server,Unique Constraint,我有一个SQL表,其结构如下: 我希望此表的工作方式是,如果表中输入的项具有相同的名称和类型,则该项仅为重复项,因此,如果将这两个项添加到数据库中,则以下示例将有效 Item 1: Name: MILE50 Acronym: MS50 Type: PRE Color: white 目前,如果我输入如图所示的数据,将导致一个错误,表明存在违反主键约束的情况。我是否误解了复合键在SQL中的工作方式?如果是这样,我如何才能实现我所追求的目标 非常感谢 编辑:更新的SQL脚本 USE [P

我有一个SQL表,其结构如下:

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

Item 1:
Name: MILE50
Acronym: MS50
Type: PRE
Color: white


目前,如果我输入如图所示的数据,将导致一个错误,表明存在违反主键约束的情况。我是否误解了复合键在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
执行以下脚本只提供一个条目:

  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

要在2列上强制唯一性,可以添加如下唯一约束:

ALTER TABLE dbo.MilestoneCategory
ADD CONSTRAINT constraint_name 
UNIQUE NONCLUSTERED (Name,Type);
PS:我认为您应该只有一个主键,即示例记录中的项。可以将MilestoneCategoryID添加为int


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

为什么要设置
Mysql
sql server
标记?两种RDBMS都使用吗?您的表非常小。你能把它写下来让我们看看键的定义吗?在你的第二个例子中,字段类型的值是多少?犯了几个错误,已经改正了。这个表是在SQL Management Studio中设计的,有没有一种方法可以显示有用的代码?这个问题有点像兔子洞,但我认为把@Jess的答案作为公认的答案是公平的。谢谢大家的帮助。非常感谢你们的帮助,在清除了恶意物品数据库后,这就是最终解决我问题的方法。它的行为并不像我所希望的那样,但大多数人都在那里,因此我对SQL有了更好的理解。
ALTER TABLE dbo.MilestoneCategory
ADD CONSTRAINT constraint_name 
UNIQUE NONCLUSTERED (Name,Type);