在 Microsoft SQL 服务器中使用复合键
Using Composite Keys in Microsoft SQL Server
我有一个 SQL table 结构如下:
我打算让这个 table 以这样的方式工作,即在 table 中输入的项目只有在具有相同的名称和类型时才是重复的,这样下面的示例才有效如果将这两项添加到数据库中。
Item 1:
Name: MILE50
Acronym: MS50
Type: PRE
Color: white
Item 2:
Name: MILE50
Acronym: MS50
Type: SYS
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:我觉得你应该只有一个主键,就是你的示例记录中的Item。您可以将 MilestoneCategoryID 添加为 int,identity column.
有关 unique constraints 的更多详细信息,请参阅此答案。
我有一个 SQL table 结构如下:
我打算让这个 table 以这样的方式工作,即在 table 中输入的项目只有在具有相同的名称和类型时才是重复的,这样下面的示例才有效如果将这两项添加到数据库中。
Item 1:
Name: MILE50
Acronym: MS50
Type: PRE
Color: white
Item 2:
Name: MILE50
Acronym: MS50
Type: SYS
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:我觉得你应该只有一个主键,就是你的示例记录中的Item。您可以将 MilestoneCategoryID 添加为 int,identity column.
有关 unique constraints 的更多详细信息,请参阅此答案。