2011-07-30 38 views

回答

5

這對於後來發現特定行有用。如果您有其他值保證每行都是唯一的,則您不一定需要額外的ID列,因爲您可以使用另一列作爲主(唯一)鍵。

但是,自增ID列的好處是,它是
一)獨特的每一行,並
二)永遠不會改變。

以StackOverflow爲例。每個問題都有一個ID(這是一個6886017),並在URL中使用ID和標題。因此,可以很容易地得到兩個相同標題的問題,因爲他們的ID仍然是唯一的。你甚至可以改變一個問題的標題,舊的鏈接仍然可以工作,因爲StackOverflow真正關注的是URL的ID部分,而不是標題部分。

+1

+1強調它是唯一標識符 –

3

不,它並不是真正需要的,但是如果不同表中的某一行需要引用該行,那麼這是唯一合理的方法(至少在該表中唯一)標識該行。

+0

謝謝。所以這是你唯一需要的情況? – Laura

+0

這對於其他需要識別除交叉表引用之外的行的方法很有用。例如,如果您想要刪除特定的行,您可以將'id = 1234'或任何其ID添加到where子句中。 – icktoofay

+0

不僅表格不同而且您的文檔可能需要此ID。例如。當您構建HTML頁面時,表單元素將此ID作爲值,因此您可以刪除用戶#123或輸入頁面#345。 –

1

這很方便(WHERE id = 123,而不是WHERE name = 'blah' and somethingelse = 'foo'),除此之外,整數指數通常是非常高效的,例如,字符串索引。除此之外

+0

但通常當你從數據庫中獲得某些東西時,你想通過名稱或其他相關字段來完成。 ID看起來像「內部」 – Laura

+0

@勞拉:它在某些方面是系統的「內部」,但它是系統內部的_you're_ building;不是數據庫本身的內部。即MySQL不關心你是否使用ID列,但它對你自己來說擁有一個唯一的ID很有用 – Flambino

+0

如果你想通過名字/任何東西來獲得一列,那麼在該列上放一個索引。但是例如拿一張存儲用戶真實姓名的表格。兩名用戶具有相同的名字並不是不太可能。所以你需要這個ID來以一種獨特的方式來識別它們。 – ThiefMaster

0

ID字段通常是該領域的主鍵。它標識該特定表中的特定字段,主鍵不能重複。它也可以用作外鍵來幫助連接表。

這裏有一個簡單的介紹:HTTP://www.opensourcevarsity.com/mysqldba/l8primaryforeignkey

+0

爲什麼選擇投票?簡單的問題,簡單的答案。 – Phil

+0

「該字段的主鍵」?一個關鍵是一組屬性。這是表格的屬性,而不是字段。主鍵不標識「特定字段」,它是一組屬性,其中的值標識唯一的*元組*(即行),而不是字段。 – sqlvogel

1

當您使用關係數據庫時,您需要能夠唯一標識每一行。在很多情況下,您可以選擇一個或多個模式數據列來爲您唯一標識一行。這就是所謂的natural key。如果你沒有簡單的方法來識別每一行,那麼你可以引入你自己的專欄,唯一目的是做這個識別。這就是所謂的synthetic key,這就是你所詢問的具有自動增量的id列。

只要您有其他方法來識別每一行,就不需要它。有可能存在彼此不可區分的行,但這會大大降低關係數據庫範例的價值。也不一定是自動遞增的數字。通常使用唯一的id字符串,例如UUID。

1

「ID」表示標識符。在關係數據庫設計中,關係中的元組(行)可以由關鍵字唯一標識,並且每個關係必須至少有一個關鍵字。

沒有鍵的表格會允許重複的行,這會導致模糊不清,結果不準確以及正確識別行意欲描述的真實世界實體的問題。因此,密鑰是任何數據庫表的數據完整性的重要方面。

但請注意,密鑰確實而不是必須是單列,也不一定是「自動遞增」。這些功能與爲桌子選擇好的按鍵無關。

+1

我只能添加一個表,其只有*鍵是一個id號允許重複數據而不允許重複行。根據應用的不同,這可能是所有可能世界中最糟糕的。 –

+1

@Catcall,取決於你的意思是「身份證號碼」。很多東西都是用數字標識的。 「身份證號碼」可能意味着一個自然的關鍵以及一個代理人。 – sqlvogel

+0

好點。我應該說,「只有密鑰是人工ID號碼的表格允許重複數據,而不允許重複行。」 (我試着保留術語*代理鍵*來描述代替自然鍵的鍵,我並不總是成功的。) –

相關問題