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



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

在PerformanceDBA的"完整示例"中,表"user"one_answers"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) 
)

谢谢你抽出时间。

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

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

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

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

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

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

这可能没有PerformedBA提供的回复那么详细,但我真诚地希望这是一种互动&您希望收到的反馈。

最新更新