2011-04-09 49 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 
);