Microsoft T-SQL不支持多于一个Primary Key;建议的解决方法?

Microsoft T-SQL does not support more than one Primary Key; Suggested Workarounds?

我正在阅读 PerformanceDBA to this 提供的精彩回复。

PerformanceDBA 'Full Example', tables 'user' and 'sport' show two PRIMARY KEY s per table. Note; should you look carefully at PerformanceDBA响应中,您会注意到主键一由一个字段组成,而主键二由三个字段组成;复合键。

给定 Microsoft T-SQL Server does not support more than one Primary Key per table (I was unaware that SQL ANSI did either), how would we achieve the concept presented by PerformanceDBA as a workable Microsoft T-SQL solution (ie, following Microsoft T-SQL 语法)?

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

我最初的想法是(table PerformanceDBA 的回答的定义,稍作修改以适应 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) 

     )

感谢您的宝贵时间。

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

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

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

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

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

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

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