Indexing Microsoft T-SQL不支持多个主键;建议的解决办法?

Indexing Microsoft T-SQL不支持多个主键;建议的解决办法?,indexing,constraints,primary-key,composite-primary-key,candidate-key,Indexing,Constraints,Primary Key,Composite Primary Key,Candidate Key,我读到了一篇关于这一点的精彩回复 在“完整示例”中,表“user”和“sport”显示每个表的两个主键。注;如果您仔细查看响应,您会注意到主键1由一个字段组成,而主键2由三个字段组成;复合键 如果服务器不支持每个表多于一个(我不知道SQL ANSI也支持),那么我们如何实现作为可行解决方案提出的概念(即,以下语法) 是否有可能提供的信息只是包括一个打字错误;他忽略了一个错误 我最初的想法是(表定义从答案到,稍作修改以适应T-SQL): 谢谢您的时间。在Microsoft SQL Server中,

我读到了一篇关于这一点的精彩回复

在“完整示例”中,表“user”和“sport”显示每个表的两个主键。注;如果您仔细查看响应,您会注意到主键1由一个字段组成,而主键2由三个字段组成;复合键

如果服务器不支持每个表多于一个(我不知道SQL ANSI也支持),那么我们如何实现作为可行解决方案提出的概念(即,以下语法)

是否有可能提供的信息只是包括一个打字错误;他忽略了一个错误

我最初的想法是(表定义从答案到,稍作修改以适应T-SQL):


谢谢您的时间。

在Microsoft SQL Server中,作为主键创建的键与使用唯一约束创建的键(当然是在不可为空的列上)之间几乎没有区别。每个表最多可以定义1000个唯一约束。语法上有一个或两个小差异,但没有特别强烈的理由使用主键约束而不是唯一约束。

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

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

你的问题很清楚,你不仅为你的问题提供了强有力的背景,而且还提供了一个简洁的解决方案;许多人在最初的问题中没有尝试的任务

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

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

实际上可能存在这样一种情况:两个人的名字、中间名和DOB都相同(因此,您可能不希望这三个字段有唯一的索引)。考虑到您只提供了基本的表设计,我猜想需要在设计需求中做更多的工作才能正确地解决这个问题


这可能没有PerformanceDBA提供的回答那么详细,但我真诚地希望这是您希望收到的互动和反馈。

从您编写此问题的方式很容易看出,您确实知道您在谈论什么:ANSI/SQL/Microsoft T-SQL,主键与唯一索引

你的问题很清楚,你不仅为你的问题提供了强有力的背景,而且还提供了一个简洁的解决方案;许多人在最初的问题中没有尝试的任务

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

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

实际上可能存在这样一种情况:两个人的名字、中间名和DOB都相同(因此,您可能不希望这三个字段有唯一的索引)。考虑到您只提供了基本的表设计,我猜想需要在设计需求中做更多的工作才能正确地解决这个问题


这可能不如PerformanceDBA提供的回答详细,但我真诚地希望这是您希望收到的那种交互和反馈。

关系模型规定每个表只能有一个主键。这方面没有“变通办法”——它就是这样。不确定要实现什么-但必须选择一个候选键作为主键,其他键被视为“备用键”(但它们不是第二个或第三个“主键”-这是不可能的)。SQL FK必须引用PK或唯一列集。这些或多或少都是相关的“超级键”。不包含较小超键的超键是CK。这才是最重要的。在SQLPK中,PK只是表示UNIQUE NOT NULL,尽管有些DBMS将其用于其他用途,如默认索引和物理存储。PKs在关系理论中没有任何作用,它只是一种传统。PK以外的CK称为AKs。PDBA对关系模型有一些正确和错误的概念。在标准SQL和任何DBMS中,两个PK的可能重复都是无效的。链接的代码将无法编译。评论说它不会编译。我们不知道作者为什么使用主键两次。也许第二个是独一无二的拼写错误。也许这是对名为AK的约束中的伪代码备用键的输入错误。也许他们两次都使用主键作为伪代码来表示候选键。(一个CK可以是PK,其他的是AKs。)只需对最多一个约束使用主键,对其余约束使用UNIQUE(非NULL)。并发表评论,问他们为什么有2个PK声明。PS那篇文章让人摸不清PK是什么。我想引用赛斯·戈丁的话;“如果你在发表意见之前没有能力(或没有足够的决心)阅读,请有勇气指出
    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) 

     )