繁体   English   中英

Microsoft SQL表可以有多个主键吗?

[英]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)中找到了这个:

§11.7 <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>

语法规则

  1. <unique column list>中的<column name>标识的每个列是分组操作的操作数。 第9.10节“语法规则”,“分组操作”适用。
  2. 令T为包含<table definition><alter table statement>标识的<alter table statement> 设TN为T的<table name>
  3. 如果指定了<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 ) 
  4. 如果指定了UNIQUE(VALUE),则让SC为<search condition>

      UNIQUE ( SELECT TN.* FROM TN ) 
  5. 如果<unique specification>指定PRIMARY KEY,则对于未指定NOT NULL的显式或隐式<unique column list>中的每个<column name><column definition>隐含NOT NULL。

  6. <table definition>最多应指定一个指定PRIMARY KEY的隐式或显式<unique constraint definition>

  7. 如果指定PRIMARY KEY的<unique constraint definition>包含在<add table constraint definition> ,则由<alter table statement>包含的<table name>标识的<table name>不应具有唯一的约束。由指定PRIMARY KEY的<unique constraint definition>

访问规则

没有。

通用规则

  1. <unique constraint definition>定义唯一约束。
    注释254-子条款10.8,“ <constraint name definition><constraint characteristics> ”指定何时有效地检查约束。
  2. 当且仅当如果,则不满足唯一约束

      EXISTS ( SELECT * FROM TN WHERE NOT ( SC ) ) 

    是真的。

一致性规则

  1. 如果没有Feature S291,“整行上的唯一约束”,符合SQL的语言不应包含UNIQUE(VALUE)。
  2. 如果没有Feature T591,“可能为空列的UNIQUE约束”,则在符合SQL语言的情况下,如果指定了UNIQUE,则<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操作在这些情况下是如何工作的。


§8.10 <unique predicate>

功能

指定缺少重复行的测试。

格式

<unique predicate> ::= UNIQUE <table subquery>

语法规则

  1. <table subquery>结果中的每个用户定义类型列都应具有比较类型。
  2. <table subquery>每一列都是分组操作的操作数。 第9.10节“语法规则”,“分组操作”适用。

访问规则

没有。

通用规则

  1. 设T是结果。
  2. 如果T中没有两行,使得一行中每列的值为非空且与另一行中相应列的值不同,则<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM