在 Microsoft SQL Server 中使用复合键

Posted

技术标签:

【中文标题】在 Microsoft SQL Server 中使用复合键【英文标题】:Using Composite Keys in Microsoft SQL Server 【发布时间】:2015-12-14 13:19:50 【问题描述】:

我有一个结构如下的 SQL 表:

我希望此表能够以这样一种方式工作,即在表中输入的项目只有在具有相同名称和类型时才会重复,因此如果将这两个项目添加到数据库中,以下示例将是有效的.

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

【问题讨论】:

为什么要设置mysqlsql-server标签?你同时使用 RDBMS 吗? 你的桌子很小。您能否编写脚本以便我们查看键的定义? 第二个示例中字段类型的值是多少? 犯了几个错误,已更正。该表是在 SQL Management Studio 中设计的,有没有一种方法可以显示有用的代码? 问题结果有点像兔子洞,但我认为将@Jess 的答案作为公认的答案是公平的。感谢大家的帮助。 【参考方案1】:

要强制 2 列的唯一性,您可以像这样添加唯一约束:

ALTER TABLE dbo.MilestoneCategory
ADD CONSTRAINT constraint_name 
UNIQUE NONCLUSTERED (Name,Type);

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

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

【讨论】:

非常感谢您的帮助,在清除了流氓项目的数据库后,这最终解决了我的问题。它的行为不像我想要的那样,但大多数都在那里,因此我对 SQL 有了更好的理解。

以上是关于在 Microsoft SQL Server 中使用复合键的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server不存在或访问被拒绝

标题: Microsoft SQL Server Management Studio

在Microsoft SQL Server中选择随机行

ubuntu下连microsoft sql server解决方案

如何在 Microsoft SQL Server 中“取消堆叠”SQL 中的数据

java.sql.SQLException [Microsoft] [ODBC SQL Server Driver] [SQL Server] 对象名“表名”无效