[英]Can a Microsoft SQL table have more than one Primary Key?
我一直很好奇,但找不到简洁的答案。 有帮助吗?
它不能有多个主键 。 但是,它可以在主键中有多个列。 它也可以有多个唯一索引 。 通常,唯一索引是主键,但是可以在单个表上具有多个唯一索引。 我无法想到一个例子,但当我这样做时,我会添加它。
编辑 :也许这样:在美国,机动车部可能会有一个人员表,其中包含2个独特的列 - 社会安全号码和驾驶执照号码。 两者都应该是独特的。
如MJB所述,一个表最多只能有一个主键,并且应始终有一个(从不为零)。 但是,表可以具有多个候选键 - 其中一个被指定为主键。 在归一化理论中,主键并不重要; 候选键(主键是候选键之一)在与归一化相关的定理中是至关重要的。
有三种可能的唯一密钥表的一个例子是,恰如其分地元素表-其中的原子数,符号或元素名称都可以用来作为主键。 实际上,取决于你是在做化学还是物理,原子序数或符号可能是最合适的主键,而另一个是替代键(元素名称可能永远是替代键而不是主键)键):
CREATE TABLE elements
(
atomic_number INTEGER NOT NULL UNIQUE CONSTRAINT c1_elements
CHECK (atomic_number > 0 AND atomic_number < 120),
symbol CHAR(3) NOT NULL UNIQUE CONSTRAINT c2_elements,
name CHAR(20) NOT NULL UNIQUE CONSTRAINT c3_elements,
atomic_weight DECIMAL(8,4) NOT NULL,
stable CHAR(1) DEFAULT 'Y' NOT NULL
CHECK (stable IN ('Y', 'N'))
);
(符号适用于Informix Dynamic Server;它与Microsoft SQL Server或任何其他SQL DBMS之间的差异非常小。您可以看到我没有将任何可能的键指定为“主键”。如果我这样做的话。 ,我可能会提名Atomic_Number 作为主键。)
感谢指点,托马斯。 我在ISO / IEC 9075-2:2003(SQL / Foundation)中找到了这个:
<unique constraint definition>
为表指定唯一性约束。
<unique constraint definition> ::=
<unique specification> <left paren> <unique column list> <right paren>
| UNIQUE ( VALUE )
<unique specification> ::=
UNIQUE
| PRIMARY KEY
<unique column list> ::= <column name list>
<unique column list>
中的<column name>
标识的每个列是分组操作的操作数。 第9.10节“语法规则”,“分组操作”适用。 <table definition>
或<alter table statement>
标识的<alter table statement>
。 设TN为T的<table name>
。 如果指定了<unique column list>
UCL,则
一种。 <unique column list>
<column name>
中的每个<column name>
应标识T列,并且不应多次标识同一列。
湾 <unique column list>
的列集应与包含在T的基表描述符中的任何其他唯一约束描述符的唯一列不同。
C。 案件:
一世。 如果<unique specification>
指定PRIMARY KEY,则让SC为<search condition>
:
UNIQUE ( SELECT UCL FROM TN ) AND ( UCL ) IS NOT NULL
II。 否则,让SC为<search condition>
:
UNIQUE ( SELECT UCL FROM TN )
如果指定了UNIQUE(VALUE),则让SC为<search condition>
:
UNIQUE ( SELECT TN.* FROM TN )
如果<unique specification>
指定PRIMARY KEY,则对于未指定NOT NULL的显式或隐式<unique column list>
中的每个<column name>
, <column definition>
隐含NOT NULL。
<table definition>
最多应指定一个指定PRIMARY KEY的隐式或显式<unique constraint definition>
。
<unique constraint definition>
包含在<add table constraint definition>
,则由<alter table statement>
包含的<table name>
标识的<table name>
不应具有唯一的约束。由指定PRIMARY KEY的<unique constraint definition>
。 没有。
<unique constraint definition>
定义唯一约束。 <constraint name definition>
和<constraint characteristics>
”指定何时有效地检查约束。 当且仅当如果,则不满足唯一约束
EXISTS ( SELECT * FROM TN WHERE NOT ( SC ) )
是真的。
<column name>
包含在<unique column list>
中的每列的<column definition>
<unique column list>
应包含NOT NULL 。 注255 - 第9.10节“符合规则”,“分组操作”也适用。
欢迎来到SQL标准的精彩世界! 似乎特征T591允许在UNIQUE约束的列中可能为空值(但不在PRIMARY KEY的列中)。 最终结果是,当UCL(唯一列列表)中的任何列中存在NULL时,您必须了解以下查询的工作方式:
EXISTS ( SELECT * FROM TN WHERE NOT (
UNIQUE ( SELECT UCL FROM TN ) ) )
而且我知道我不确定UNIQUE操作在这些情况下是如何工作的。
<unique predicate>
指定缺少重复行的测试。
<unique predicate> ::= UNIQUE <table subquery>
<table subquery>
结果中的每个用户定义类型列都应具有比较类型。 <table subquery>
每一列都是分组操作的操作数。 第9.10节“语法规则”,“分组操作”适用。 没有。
<unique predicate>
的结果为True; 否则,结果是假的。 1)如果没有Feature F291,“UNIQUE谓词”,符合SQL的语言不得包含<unique predicate>
。
注193 - 第9.10节“符合规则”,“分组操作”也适用。
据我所知,只有一个。 但是,您可以将多个列(通常最多8或20,具体取决于RDBMS)与其他列组合作为唯一标识行的复合键。 单个主键,单列或复合,也可用于连接另一个表中的外键(一对多,多对一或多对多关系)。
不,一张桌子不能有多个PK。
但是它可以有一个复合键(一个PK在其定义中包含多个列)。 此外,您可以拥有多个唯一约束,这些约束也可以跨多个列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.