我正在阅读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提供的回复那么详细,但我真诚地希望这是一种互动&您希望收到的反馈。