【问题标题】:SQL Primary KeySQL 主键
【发布时间】:2011-04-09 17:25:53
【问题描述】:

我遇到了2个版本的sql代码..

--1
CREATE TABLE Location ( 
Id     INTEGER PRIMARY KEY 
                   NOT NULL,
Name   TEXT    NOT NULL 
);

--2
CREATE TABLE Location ( 
    Id     INTEGER PRIMARY KEY 
                       NOT NULL
                       UNIQUE,
    Name   TEXT    NOT NULL 
);

在SQL中,是否需要指定主键唯一且不为空?
我一直认为主键是唯一的,不能为空。

【问题讨论】:

  • 不要犹豫,尝试执行代码。
  • 第二个语法无效。 Both a PRIMARY KEY and UNIQUE constraint have been defined for column 'Id', table 'Location'. Only one is allowed.
  • @Martin。第二条 sql 语句在 sqlite 中运行良好
  • @Maurice - 对不起,我一定错误地认为这是标记为sql-server(这给出了上面的错误)
  • @Maurice:你为什么要问一个关于 TSQL 的问题并检查 SQLite 中的相应代码?

标签: sql primary-key unique-key


【解决方案1】:

一张表最多可以有一个主键,但可以有多个唯一键。主键是唯一指定行的列的组合。这是唯一键的特例。一个区别是主键具有隐式 NOT NULL 约束,而唯一键则没有。

【讨论】:

    【解决方案2】:

    在主键列上指定“UNIQUE”是多余的 - 作为主键已经确保了这种情况。

    【讨论】:

    • NOT NULL 也是如此,主键永远不能为空。
    【解决方案3】:

    UNIQUE 和 NOT NULL 都是不必要的,因为 PRIMARY KEY 意味着两者。

    【讨论】:

      【解决方案4】:

      您的代码是有效的语法。它将创建覆盖同一列的PRIMARY KEYUNIQUE 约束。

      表具有多个键但不在同一组列上是有正当理由的。一个表可能只有一个键被标记为“主要”。每个表都需要至少一个键,但不需要将键标记为“主键”,即使表只有一个键。

      在 SQL Server 中,标记为“主要”具有含义(例如 NOT NULL、创建外键引用时的默认键等),但我更喜欢明确说明这些事情。大概是为了让你的桌子有一个唯一的钥匙,所以我建议你省略PRIMARY KEY。我进一步建议你给你的 UNIQUE 键一个明确的名字,例如

      CREATE TABLE Location 
      ( 
       Id INTEGER NOT NULL 
          CONSTRAINT Location__key UNIQUE, 
       Name TEXT NOT NULL 
      );
      

      【讨论】:

        猜你喜欢
        • 2010-10-24
        • 2020-07-07
        • 2013-04-05
        • 1970-01-01
        • 2014-07-17
        • 2018-06-26
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多