2017-02-17 105 views
-1

它的用途是什麼,何時標識唯一排? 爲什麼人們使用身份列作爲主要的關鍵? 任何人都可以簡要描述答案嗎?主鍵和身份有什麼區別?

+1

的身份是一種由所使用 – Laazo

+0

你需要指定你正在使用完全相同的RDBMS RDBMS定義主鍵。 – Sasha

回答

1

主鍵是一個邏輯概念 - 它是用來唯一標識表中每條記錄的方法。有幾種主鍵 - 自然鍵使用來自業務領域的數據屬性,該屬性保證對主鍵(唯一的,非空的,不變的)有要求,如社會安全號碼,複合鍵是密鑰由多個列組成(通常用於「父 - 子」關係中),並由系統創建代理鍵;它可能是一個自動增量或標識列。

身份是一種數據類型。它用作代理主鍵非常有用,因爲它具有所有必需的屬性。您不太可能將身份類型用作主鍵以外的其他用途,但沒有任何可阻止您這樣做的東西。

因此,並非所有主鍵都使用標識數據類型,並非所有標識列都是主鍵。

0

主鍵所需的唯一編號和主鍵值不能爲null,可以通過標識獲得,我們不需要手動添加每個添加到表中的新記錄。

當記錄因某種原因在表中插入失敗時,也會在sql server中增加身份。

+0

在哪種情況下,我們在特定的表中使用多個身份密鑰? –

0

主鍵是一種唯一鍵。實際上,它是限制(約束),即特定列(或者通常情況下,列集)的值在不同行中不能相同(即使手動/顯式地使用插入/更新設置爲相同值) 。

主/唯一密鑰不需要自動遞增。實際上,它並不是必需的,它可以是文本或其他類型。

主鍵比通常的唯一鍵要嚴格一點,因爲它通常暗示着NOT NULL,除此之外,每個表只允許有一個主鍵(每個表允許除主鍵以外允許多個唯一鍵) 。

創建主鍵/唯一鍵通常會隱式創建索引,以便更快地對該列進行搜索和約束檢查。

E.g.如果列my_tablemy_column被標記爲主要或唯一鍵,你不能做到這一點:在你的RDBMS

INSERT INTO my_table (my_column, other_column, third_column) 
    VALUES (10, …, …); 
INSERT INTO my_table (my_column, other_column, third_column) 
    VALUES (10, …, …); -- the same value for my_column again 

身份是什麼其他的RDBMS可致電AUTO_INCREMENT串行。這只是一個功能,在行插入操作期間,特定列在未被顯式設置爲某個值時會自動初始化爲(最常見)連續整數值。

E.g.如果列my_tablemy_column被標記爲AUTO_INCREMENT /串口/身份,你可以這樣做:

INSERT INTO my_table (other_column, third_column) VALUES (…, …); 
    -- not specifying any value for my_column manually, 
    -- it'll be initialized automatically to some value 
    -- (usually an increasing integer sequence) 

AUTO_INCREMENT /串口/身份通常不保證嚴格 consequentiality自動值(尤其是在中止交易的情況下, )。

具體documentation for TRANSACT-SQL說,身份不保證:

  • 唯一性(使用唯一的/主鍵強制執行);
  • 嚴格的結果。

更新:作爲a_horse_with_no_name suggested,「身份」似乎不僅是一個特定的RDBMS內的公共AUTO_INCREMENT /串口/身份特徵(如Microsoft SQL Server)的名稱,而且還通過ANSI SQL定義的名稱標準。從我上面所描述的(關於實現中的常見auto_increment/serial/identity特徵)我們可以看出,它並沒有不同於。我的意思是它使列值自動用一個整數序列初始化,但並不保證唯一性和嚴格的結果。

儘管如此,我想的是,不同於在MySQL/PostgreSQL的AUTO_INCREMENT /串行列,一個ANSI-SQL標準generated always as identity列不允許其值來手動設置在INSERT或UPDATE(自動地)。

+0

標準ANSI SQL中還有「身份」的概念。您可以將一列定義爲「始終以身份生成」 –

+0

@a_horse_with_no_name,謝謝,我不知道。 – Sasha

+0

ANSI SQL還允許'默認爲identity'這是基本相同的Postgres''serial' –

0

在數據庫表中,每一行都應該是唯一的,並且您需要能夠唯一標識一個特定的行。

給定表可能有一個或多個具有唯一值的列,因此任何這些列都可以完成這項工作。也可能有兩列或更多列,雖然它們本身並不獨一無二,但形成了獨特的組合。那也會。

任何可以唯一標識一行的列或列的組合稱爲候選鍵。原則上,你可以選擇任何你喜歡的鑰匙,但你需要確保唯一性是持久的。例如,在一張小桌子上,給定的名字可能是獨一無二的,但你冒着與下一個人一起吹的危險。

A 主鍵是您提名爲首選 鍵的候選鍵。例如,一張人物表可能有許多獨特的屬性,例如電子郵件地址,手機號碼等。主鍵是您選擇的屬性優先於其他屬性。

以下是嚴格要求,但對好的做法良好的主鍵:

  • 主鍵不應改變
  • 主鍵不應該被回收

出於這個原因,一個主鍵不應該有任何實際意義,所以應該永遠是一個理由去改變或重新使用。因此,主鍵通常是一個任意代碼,其唯一真正的含義就是它標識了該行。如果鑰匙純粹用於識別和有沒有其他的意思,它常常被稱爲代理鍵

您可以付出一些努力來生成任意代碼。有時他們會遵循複雜的模式來檢查其有效性。

如果你想採取更加懶惰的方法,你可以使用序列號。相反,我以前的意見,不過,它確實有點有一個含義:它是嚴格順序的,這樣你就可以瞭解哪些行被另一個之後添加,但不完全時。然而,這一事實不會改變 - 它不會改變價值,也不會被重用 - 所以它仍然非常穩定。

標識列是,實際上,一個序列號。它是自動生成的,並且如果您想爲您的主鍵使用任意代碼,這將非常有用。不幸的是比較晚的非常緩慢的移動標準,所以每一個DBMS有其自己的非標準變化:

  • MySQL調用它AUTO_INCREMENT
  • SQLite的調用它AUTOINCREMENT
  • MSSQL稱之爲IDENTIY()
  • MSACCESS稱之爲AUTONUMBER
  • PostgreSQL的調用它SERIAL

,每個人都有自己的怪癖。

最近(2003年,我相信)它已被添加到標準的形式:

int generated by default as identity 

但這只是剛剛開始出現在PostgreSQL和甲骨文。這種使用IDENTITY的行爲與微軟的不同。