2011-04-09 64 views
2

我穿过2个版本的SQL代码来..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中,是有必要指定主键是唯一的,而不是空?
我总是假定主键是唯一的,不能为空。

+3

**请不要犹豫,尝试执行代码** – 2011-04-09 17:35:45

+0

第二个是无效的语法。 '对于列'Id',表'Location'定义了PRIMARY KEY和UNIQUE约束。只有一个被允许。' – 2011-04-09 19:49:25

+0

@马丁。第二个sql语句在sqlite中运行良好 – Eminem 2011-04-10 12:05:19

回答

4

一个表最多只能有一个主键,但多于一个唯一键。主键是唯一指定行的列的组合。这是唯一键的特殊情况。一个区别是主键具有隐式NOT NULL约束,而唯一键不具有。

3

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

+0

对于NOT NULL也是如此,主键不能为空。 – 2011-04-09 17:33:39

2

UNIQUE和NOT NULL都是不必要的,因为PRIMARY KEY暗示两者。

2

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

表有多个键但不在同一列上的合法原因。一个表格可能只有一个标记为“主要”的键。每张表至少需要一个密钥,但不要求将密钥标记为“主要”,即使表只有一个密钥。

在SQL Server中,标记为“主要”有影响(例如,NOT NULL,创建外键引用时的默认键等),但我更愿意明确说明这些事情。大概意图是让你的桌子有一个唯一的关键,所以我建议你省略PRIMARY KEY。我还建议你给你的UNIQUE键一个明确的名字,例如

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