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

Ser*_*pia 3 sql sql-server primary-key

我一直很好奇,但找不到简洁的答案.有帮助吗?

MJB*_*MJB 9

它不能有多个主键.但是,它可以在主键中有多个列.它也可以有多个唯一索引.通常,唯一索引是主键,但是可以在单个表上具有多个唯一索引.我无法想到一个例子,但当我这样做时,我会添加它.

编辑:也许这样:在美国,机动车部可能会有一个人员表,其中包含2个独特的列 - 社会安全号码和驾驶执照号码.两者都应该是独特的.

  • 另一件需要考虑的事情:主键不能有任何NULL值,唯一索引可以正好1 (2认同)
  • 我建议定义唯一约束而不是索引,更好地显示意图.并且在功能上与主键无关,唯一约束中的所有列都不需要为空. (2认同)

Jon*_*ler 5

如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'))
);
Run Code Online (Sandbox Code Playgroud)

(符号适用于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>
Run Code Online (Sandbox Code Playgroud)

语法规则

  1. 由a <column name>中标识的每一列<unique column list>是分组操作的操作数.第9.10节"语法规则","分组操作"适用.
  2. 设T为包含<table definition>或表示的表<alter table statement>.让TN成为<table name>T.的T.
  3. 如果<unique column list>指定了UCL,那么

    一个.每个<column name>中的每一个<unique column list>都应标识一列T,同一列不应被识别多次.
    湾 该列中的列集<unique column list>应与包含在T的基表描述符中的任何其他唯一约束描述符的唯一列不同
    .案例:
    我 如果<unique specification>指定PRIMARY KEY,那么让SC为<search condition>:

            UNIQUE ( SELECT UCL FROM TN )
            AND
            ( UCL ) IS NOT NULL
    
    Run Code Online (Sandbox Code Playgroud)

    II.否则,让SC为<search condition>:

            UNIQUE ( SELECT UCL FROM TN )
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果指定了UNIQUE(VALUE),那么让SC为<search condition>:

        UNIQUE ( SELECT TN.* FROM TN )
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果<unique specification>指定PRIMARY KEY,那么对于未指定NOT NULL <column name>的显式或隐式中的每一个<unique column list>,NOT NULL隐含在<column definition>.

  6. A <table definition>应指定最多一个<unique constraint definition>指定PRIMARY KEY的implicit或explicit .

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

访问规则

没有.

通用规则

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

      EXISTS ( SELECT * FROM TN WHERE NOT ( SC ) )
    
    Run Code Online (Sandbox Code Playgroud)

    是真的.

一致性规则

  1. 如果没有Feature S291,"整行上的唯一约束",符合SQL的语言不应包含UNIQUE(VALUE).
  2. 如果没有功能T591,"可能是空列的UNIQUE约束",在符合要求的SQL语言,如果是指定的唯一,那么<column definition>对于其每一列<column name>包含在<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 ) ) )
Run Code Online (Sandbox Code Playgroud)

而且我知道我不确定UNIQUE操作在这些情况下是如何工作的.


第8.10节 <unique predicate>

功能

指定缺少重复行的测试.

格式

<unique predicate> ::= UNIQUE <table subquery>
Run Code Online (Sandbox Code Playgroud)

语法规则

  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节"符合规则","分组操作"也适用.