2016-11-23 87 views
2

我發現了一些遺留代碼,它爲主鍵字段設置了兩個幾乎相同的約束條件(UNIQUEPRIMARY KEY)。MySQL。同一字段的UNIQUE和PRIMARY KEY約束

下面是代碼示例:

CREATE TABLE foofoo (
    id NUMERIC(9) NOT NULL , 
    bar VARCHAR(40) NOT NULL, 

    CONSTRAINT PK_foofoo PRIMARY KEY (id), 
    CONSTRAINT UNIQUE_foofoo UNIQUE(id) 
) 

,我認爲它是多餘的,在這兩種組和PRIMARY KEY會做的工作。

當然,我讀什麼是這兩個約束之間的差異,但

什麼是對同一領域設置這兩個約束的地步?

+0

可能重複[主鍵和唯一鍵之間的區別](http://stackoverflow.com/questions/9565996/difference-between-primary -key-and-unique-key) – e4c5

+0

e4c5我沒有要求區別,我在問爲什麼任何人都應該爲相同的字段設置這兩個約束。也許這背後有一個原因。 – Benas

+1

@ e4c5,你認爲這是相關答案的重複嗎?你可以解釋嗎。 – Rahul

回答

2

這樣做沒有意義。主鍵本質上總是唯一的。我建議不要創建兩個索引,因爲索引帶有成本(主要是磁盤空間)。只需創建PK,你就會很棒!

+1

另外,既然您在問這個問題,我強烈建議您儘可能多地閱讀索引。它們是非常棒的東西,非常方便,但它們是一把雙刃劍。如果不小心使用它們,它們可能會變得非常巨大,但如果使用得當,它們可以創造奇蹟。對這裏的簡單評論幾乎不會抓到表面,所以是的,我推薦閱讀這個主題。通過添加一個簡單的索引,我可以從幾分鐘到幾秒鐘加快查詢速度。但是,再次注意你所做的事情,他們最終可能會讓你付出的代價超過他們給你的。 –

+1

我已經看到數據庫的字面千兆無用索引...也不要忘記那些也與您的數據庫備份。因此,如果您設置頻繁的備份,比如每天晚上或類似的事情,那麼您的索引不僅會使您的生產數據庫變大,而且還會使備份和開發數據庫變得更大(如果有的話)。所以再讀一遍,他們很棒,但不要濫用它們! –

1

設置與PK完全相同的限制沒有意義。

主鍵已經確保此列是唯一的且已編制索引。

1

,我認爲它是多餘的......

是的確它是多餘的;因爲無論如何對列有主鍵約束將確保該列只有唯一的值。在同一列上定義一個額外的UNIQUE約束沒有意義。

1

在聲明初級那麼: * PRIMARY KEY約束唯一標識數據庫表中的記錄 *主鍵必須包含唯一值 所以他們沒有必要申報主鍵獨一無二的,因爲每當ü聲明任何主鍵然後UNIQUE值已經附加在它們上面。 對於唯一鍵: * UNIQUE約束唯一標識數據庫表中的每條記錄。 * UNIQUE和PRIMARY KEY約束條件都爲一列或一組列的唯一性提供了保證。 * PRIMARY KEY約束自動在其上定義一個UNIQUE約束。 最重要的一點是 *請注意,每個表可以有多個UNIQUE約束,但每個表只能有一個PRIMARY KEY約束。 在MySQL中,當我採取相同的主鍵和唯一那麼它給了我錯誤