為什麼主鍵有自己的名字?
從數學的角度來看,如果一個表最多有一個主鍵,那麼用任意名稱而不是簡單的表屬性來引用主鍵似乎是一種短視的設計決策。
因此,要將主鍵從非集群更改為集群,反之亦然,您必須首先搜尋其名稱,然後將其刪除並最終讀取它。
使用我看不到的任意名稱是否有一些優勢,或者是否有 DBMS 不使用任意名稱作為主鍵?
編輯 2011-02-22 (02/22/2011 對於那些不想在那裡排序的人):
讓我展示這個函式,您可以使用它從表名中派生主鍵的名稱(使用早期的 sql-sever aka sybase 系統表):
create function dbo.get_pk (@tablename sysname) returns sysname as begin return (select k.name from sysobjects o join sysobjects k on k.parent_obj = o.id where o.name = @tablename and o.type = 'U' and k.type = 'k') end go
正如 gbn 所說,沒有人真正喜歡生成的名稱,當您不提供明確的名稱時:
create table example_table ( id int primary key ) select dbo.get_pk('example_table')
我剛得到
PK__example___3213E83F527E2E1D
但是為什麼 sysobjects 中的名稱必須是唯一的。對錶及其主鍵使用完全相同的名稱是完全可以的。
這樣做,我們不需要設置命名約定,這可能會被意外違反。
現在回答瑪麗安:
- 我僅以將群集主鍵更改為非群集主鍵的任務為例,我需要知道 pk 的實際名稱才能刪除它。
- 事物不需要有專有名稱,只要它們可以很容易地唯一表示就足夠了。這是抽象的基礎。物件導向的程式就是這樣。您不需要為不同類的相似屬性使用不同的名稱。
- 它是任意的,因為它是表的屬性。如果你想使用它,你只需要知道表的名稱。
主鍵(和其他唯一約束)被實現為索引,並以完全相同的方式處理 - 從程序員的角度來看,為 PK 和索引設置單獨的程式碼路徑是沒有意義的(它會使潛在的錯誤)。
除了被外鍵引用之外,PK 只是一個唯一約束,它又被實現為索引,因此更改 PK 的屬性與更改任何其他索引的屬性相同。同樣具有顯式名稱意味著它們可以像任何其他索引一樣在查詢提示中引用。
不確定我是否完全理解這個問題。
如果您在表上有一個索引並且您想要/需要更改索引,您是否還需要根據它的名稱來更改它?我想您可以查找索引的 objectID 並以這種方式進行更新,但名稱往往有助於人們從邏輯上理解他們正在使用的對象。
因此,也許答案是,如果您使用了一個強大的命名約定(即,name_PK 表示主鍵),那麼您將能夠輕鬆辨識您正在使用表的主鍵。
我想同樣的事情也可以用於定義 FK 關係。我認為名稱的使用是為了邏輯解釋,因為對象本身都有不同的 objectID。