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