代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

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

  •  3
  • Sergio Tapia  · 技术社区  · 14 年前

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

    4 回复  |  直到 14 年前
        1
  •  9
  •   MJB    14 年前

    它不能有多个 主键 唯一索引 . 通常,唯一索引是主键,但是在一个表上可能有多个唯一索引。我脑子里想不出一个例子,但当我想到的时候,我会加上它。

    编辑 :可能是这样的:在美国,机动车辆部可能有一个带有两个唯一列的person表--社会保险号和驾照号。两者都应该是独一无二的。

        2
  •  5
  •   Jonathan Leffler    14 年前

    这个

    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动态服务器;它与microsoftsqlserver或任何其他sqldbms之间的区别都很小。您可以看到,我没有将任何可能的键指定为“主键”。如果我这么做了,我可能会提名原子序数为 主键。)


    §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. 每列由 <column name> <unique column list> 操作。第9.10款“分组操作”的语法规则适用。
    2. 设T为包含 <table definition> <alter table statement> <table name> 对T。
    3. 如果 <

      答。每个 <列名> <唯一列列表> 应标识T列,且同一列 标识不得超过一次。
      b。中的列集 <唯一列列表> 应区别于任何其他
      c。案例:
      <unique specification> 指定主键,然后让SC作为 <search condition> :

              UNIQUE ( SELECT UCL FROM TN )
              AND
              ( UCL ) IS NOT NULL
      

      <搜索条件> :

              UNIQUE ( SELECT UCL FROM TN )
      
    4. 如果指定了UNIQUE(VALUE),那么让SC作为 <搜索条件> :

          UNIQUE ( SELECT TN.* FROM TN )
      
    5. <独特规格> < 在显式或 隐性的 <唯一列列表> 对于未指定NOT NULL的,NOT NULL在 <column definition> .

    6. A <表定义> 最多应指定一个隐式或显式 < 那个 指定主键。

    7. 如果 < 指定主键包含在 <add table constraint definition> < <alter table statement> 不应具有由 < 指定的主键。

    访问规则

    没有。

    一般规则

    1. <唯一约束定义> 定义唯一约束。
      注254第10.8款, <constraint name definition> <constraint characteristics> ,指定何时启用约束 有效检查。
    2. 唯一约束不满足当且仅当

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

      这是真的。

    一致性规则

    1. 如果没有特征S291,整行上的唯一约束,则一致的SQL语言不应包含 唯一(值)。
    2. 如果指定了UNIQUE,则 <column definition> <列名> 包含 在 <唯一列列表> 不应包含NULL。


    欢迎来到SQL标准的奇妙世界!特性T591似乎允许在唯一约束的列中(但不允许在主键的列中)使用空值。最终的结果是,您必须了解当UCL(唯一列列表)中的任何列中存在空值时,以下查询是如何工作的:

          EXISTS ( SELECT * FROM TN WHERE NOT (
                   UNIQUE ( SELECT UCL FROM TN ) ) )
    


    §8.10 <unique predicate>

    格式

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

    语法规则

    1. <table subquery> 应具有比较类型。
    2. <表子查询> 第9.10款,分组操作,适用。

    一般规则

    1. 如果T中没有两行,使得一行中每一列的值都是非空的,并且不是不同的 从另一行中对应列的值,然后 <唯一谓词> 是的;否则,结果为假。

    一致性规则

    1) 如果没有特征F291,唯一谓词,一致性SQL语言不应包含 <unique predicate> .

    注193第9.10款分组操作的一致性规则也适用。

        3
  •  0
  •   Joe R.    14 年前

    据我所知,只有一个。但是,可以将多个列(通常最多8或20列,具体取决于RDBMS)与其他列组合作为一个复合键来唯一标识行。单列或复合主键也可用于连接到另一个表中的外键(一对多、多对一或多对多关系)。

        4
  •  0
  •   Joe Phillips    14 年前

    但是,它可以有一个复合键(一个PK在其定义中包含多个列)。此外,还可以具有多个唯一约束,这些约束也可以跨越多个列。