0

我正在阅读PerformanceDBA对此SQL Question提供的精彩回复。

PerformanceDBA 'Full Example' 中,表 'user' 和 'sport' 显示每个表的两个 PRIMARY KEY 。 笔记; 如果您仔细查看PerformanceDBA响应,您会注意到主键一由一个字段组成,而主键二由三个字段组成;复合键。

鉴于Microsoft T-SQL Server 不支持每个表多个主键(我不知道 SQL ANSI 也支持),我们如何实现PerformanceDBA提出的概念作为可行的Microsoft T-SQL解决方案(即,遵循Microsoft T -SQL语法)?

PerformanceDBA提供的信息是否有可能只是包含一个错字?他忽略了一个错误?

我最初的想法是(PerformanceDBA对SQL 问题的回答中的表定义,稍作修改以适应 T-SQL):

    CREATE TABLE [User] (              -- Typical Identifying Table
       [user_name]  CHAR(16) NOT NULL, -- Short PK
       name_first CHAR(30) NOT NULL,   -- Alt Key.1
       name_last  CHAR(30) NOT NULL,   -- Alt Key.2
       birth_date DATE     NOT NULL ,  -- Alt Key.3

        --Create a unique CONSTRAINT and assign a Foreign Key (
       CONSTRAINT User_PK  PRIMARY KEY ( [user_name] ),

       -- Will this 'do'?
       CONSTRAINT User_AK  UNIQUE  ( name_last, name_first, birth_date ),

       CONSTRAINT user_FK -- unique person identification
          FOREIGN KEY (name_last, name_first, birth_date) 
          REFERENCES [Person] ( name_last, name_first, birth_date) 

     )

感谢您的时间。

4

2 回答 2

4

在 Microsoft SQL Server 中,作为 PRIMARY KEY 创建的键和使用 UNIQUE 约束创建的键(当然是在不可为空的列上)之间几乎没有区别。每个表最多可以定义 1000 个 UNIQUE 约束。语法上存在一两个细微差别,但没有特别充分的理由使用 PRIMARY KEY 约束而不是 UNIQUE 约束。

于 2018-12-10T08:35:28.583 回答
0

从你写这个问题的方式很容易看出你实际上知道你在说什么:ANSI / SQL / Microsoft T-SQL,主键与唯一索引。

您的问题很清楚,您不仅为您的问题提供了强有力的背景,而且还提供了一个简洁的解决方案;许多人没有尝试作为初始问题的一部分的任务。

我已阅读 PerformanceDBA 的回复,您的问题仍然存在;哪个索引是主键,哪个索引是(唯一)索引(应该是唯一索引)?

我怀疑在这种情况下user_name是所需的主键,因为它不仅需要是唯一的,而且在许多系统中,单个登录必须是唯一的。在这种情况下,名字、中间名和 DOB 成为外键 (UNIQUE INDEX)。

实际上可能存在两个人的名字、中间名和出生日期相同的情况(因此您可能不希望这三个字段上的唯一索引)。鉴于您只提供了基本的表格设计,我推测需要在设计要求中做更多的工作才能正确解决这个问题。

这可能不像 PerformaceDBA 提供的回复那么详细,但我真诚地希望这是您希望收到的那种互动和反馈。

于 2018-12-20T23:30:06.277 回答