它的用途是什麼,何時標識唯一排? 爲什麼人們使用身份列作爲主要的關鍵? 任何人都可以簡要描述答案嗎?主鍵和身份有什麼區別?
回答
主鍵是一個邏輯概念 - 它是用來唯一標識表中每條記錄的方法。有幾種主鍵 - 自然鍵使用來自業務領域的數據屬性,該屬性保證對主鍵(唯一的,非空的,不變的)有要求,如社會安全號碼,複合鍵是密鑰由多個列組成(通常用於「父 - 子」關係中),並由系統創建代理鍵;它可能是一個自動增量或標識列。
身份是一種數據類型。它用作代理主鍵非常有用,因爲它具有所有必需的屬性。您不太可能將身份類型用作主鍵以外的其他用途,但沒有任何可阻止您這樣做的東西。
因此,並非所有主鍵都使用標識數據類型,並非所有標識列都是主鍵。
主鍵所需的唯一編號和主鍵值不能爲null,可以通過標識獲得,我們不需要手動添加每個添加到表中的新記錄。
當記錄因某種原因在表中插入失敗時,也會在sql server中增加身份。
在哪種情況下,我們在特定的表中使用多個身份密鑰? –
主鍵是一種唯一鍵。實際上,它是限制(約束),即特定列(或者通常情況下,列集)的值在不同行中不能相同(即使手動/顯式地使用插入/更新設置爲相同值) 。
主/唯一密鑰不需要自動遞增。實際上,它並不是必需的,它可以是文本或其他類型。
主鍵比通常的唯一鍵要嚴格一點,因爲它通常暗示着NOT NULL
,除此之外,每個表只允許有一個主鍵(每個表允許除主鍵以外允許多個唯一鍵) 。
創建主鍵/唯一鍵通常會隱式創建索引,以便更快地對該列進行搜索和約束檢查。
E.g.如果列my_table
my_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_table
my_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(僅自動地)。
標準ANSI SQL中還有「身份」的概念。您可以將一列定義爲「始終以身份生成」 –
@a_horse_with_no_name,謝謝,我不知道。 – Sasha
ANSI SQL還允許'默認爲identity'這是基本相同的Postgres''serial' –
在數據庫表中,每一行都應該是唯一的,並且您需要能夠唯一標識一個特定的行。
給定表可能有一個或多個具有唯一值的列,因此任何這些列都可以完成這項工作。也可能有兩列或更多列,雖然它們本身並不獨一無二,但形成了獨特的組合。那也會。
任何可以唯一標識一行的列或列的組合稱爲候選鍵。原則上,你可以選擇任何你喜歡的鑰匙,但你需要確保唯一性是持久的。例如,在一張小桌子上,給定的名字可能是獨一無二的,但你冒着與下一個人一起吹的危險。
A 主鍵是您提名爲首選 鍵的候選鍵。例如,一張人物表可能有許多獨特的屬性,例如電子郵件地址,手機號碼等。主鍵是您選擇的屬性優先於其他屬性。
以下是不嚴格要求,但對好的做法良好的主鍵:
- 主鍵不應改變
- 主鍵不應該被回收
出於這個原因,一個主鍵不應該有任何實際意義,所以應該永遠是一個理由去改變或重新使用。因此,主鍵通常是一個任意代碼,其唯一真正的含義就是它標識了該行。如果鑰匙純粹用於識別和有沒有其他的意思,它常常被稱爲代理鍵。
您可以付出一些努力來生成任意代碼。有時他們會遵循複雜的模式來檢查其有效性。
如果你想採取更加懶惰的方法,你可以使用序列號。相反,我以前的意見,不過,它確實有點有一個含義:它是嚴格順序的,這樣你就可以瞭解哪些行被另一個之後添加,但不完全時。然而,這一事實不會改變 - 它不會改變價值,也不會被重用 - 所以它仍然非常穩定。
標識列是,實際上,一個序列號。它是自動生成的,並且如果您想爲您的主鍵使用任意代碼,這將非常有用。不幸的是比較晚的非常緩慢的移動標準,所以每一個DBMS有其自己的非標準變化:
- MySQL調用它
AUTO_INCREMENT
- SQLite的調用它
AUTOINCREMENT
- MSSQL稱之爲IDENTIY()
- MSACCESS稱之爲
AUTONUMBER
- PostgreSQL的調用它
SERIAL
,每個人都有自己的怪癖。
最近(2003年,我相信)它已被添加到標準的形式:
int generated by default as identity
但這只是剛剛開始出現在PostgreSQL和甲骨文。這種使用IDENTITY
的行爲與微軟的不同。
- 1. 只有主鍵和主鍵約束有什麼區別?
- 2. 主鍵和主屬性有什麼區別?
- 3. cassandra中的行鍵,主鍵和索引有什麼區別?
- 4. 主鍵和代理鍵有什麼區別?
- 5. Tweeter中的簡單和OAuth身份驗證有什麼區別?
- 6. OOP中的身份和平等有什麼區別?
- 7. 通用LDAP和集成Windows身份驗證有什麼區別?
- 8. SBT - 姓名和身份證有什麼區別?
- 9. Facebook的PHP API和oAuth身份驗證有什麼區別?
- 10. NServiceBus.Distributor和主節點有什麼區別
- 11. 穩定和主人有什麼區別?
- 12. 檢查和外鍵有什麼區別?
- 13. 主鍵和聚集索引有什麼區別?
- 14. 有什麼區別`和$(Bash中有什麼區別?
- 15. 有什麼區別? :和||
- 16. &&和||有什麼區別?
- 17. 「/」和「/ *」有什麼區別?
- 18. 有什麼區別:。!和:r!?
- 19. ==和===有什麼區別?
- 20. Appender和〜有什麼區別?
- 21. $ @和$ *有什麼區別?
- 22. is和=有什麼區別?
- 23. #.00和#。##有什麼區別?
- 24. `==`和`is`有什麼區別?
- 25. '=='和'==='有什麼區別?
- 26. /和/#/有什麼區別?
- 27. | 0和~~有什麼區別?
- 28. `&`和`ref`有什麼區別?
- 29. ==和===有什麼區別?
- 30. ==和===有什麼區別?
的身份是一種由所使用 – Laazo
你需要指定你正在使用完全相同的RDBMS RDBMS定義主鍵。 – Sasha