[英]Can I use identity for primary key in more than one table in the same ER model
正如標題中所說,我的問題是我可以在同一個 ER 模型中的多個表中使用int identity(1,1)
作為主鍵嗎? 我在 Internet 上發現主鍵需要具有唯一值和行,例如,如果我為表設置int identity (1,1)
:
CREATE TABLE dbo.Persons
(
Personid int IDENTITY(1,1) PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
GO
和另一張桌子
CREATE TABLE dbo.Job
(
jobID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
nameJob NVARCHAR(25) NOT NULL,
Personid int FOREIGN KEY REFERENCES dbo.Persons(Personid)
);
Personid
和jobID
不會具有相同的值並因此導致錯誤嗎?
約束通常被定義並且具有數據庫中一個表(對象)的范圍。 唯一的例外是FOREIGN KEY
,它通常具有對另一個表的REFERENCE
。
PRIMARY KEY
(或任何UNIQUE
鍵)僅在其定義的表上設置約束,並且不影響或不受其他表上的其他約束的影響。
PRIMARY KEY
定義一列或一組列,可用於唯一標識一個表中的一條記錄(並且所有列都不能保存NULL
,另一方面UNIQUE
允許NULL
,並且處理方式可能因不同而異數據庫引擎)。
所以是的,您可能對PersonID
和JobID
具有相同的值,但它們的含義是不同的。 (並且要選擇一條唯一記錄,您需要告訴 SQL Server 在哪個表中以及在該表的哪一列中查找它,這是表列表和查詢中的WHERE
或JOIN
條件)。
查詢SELECT * FROM dbo.Job WHERE JobID = 1;
和SELECT * FROM dbo.Person WHERE PersonID = 1;
即使您搜索的值相同,也具有不同的含義。
您將在表上定義IDENTITY
(表只能有一個IDENTITY
列)。 您不需要在列上定義IDENTITY
以在其中包含值1
, IDENTITY
只是為您提供了一種為每個表生成唯一值的簡單方法。
您可以使用SEQUENCE
跨表共享序列,但這不會阻止您手動將相同的值插入到多個表中。
簡而言之,列中存儲的值只是一個值,表名、列名以及業務規則和角色都會賦予它意義。
對於“每個表都需要有一個PRIMARY KEY
和IDENTITY
的概念,我想補充一點,在大多數情況下,表中有多個(獨立)鍵。通常每個實體都有一些你可以稱之為business key
的東西,即用松散的術語來說,業務(人類)用來識別某物的密鑰。這個密鑰與帶有IDENTITY
的PRIMARY KEY
非常相似,但通常具有相同的特征。
這可以是產品的條形碼,或員工的身份證號碼,或在另一個系統(例如 HR)中生成的東西,或分配給客戶或合作伙伴的代碼。
這些business keys
對人類有用,但對計算機並不總是有用,但它們可以用作PRIMARY KEY
。
在我們(開發人員、架構師)喜歡簡單性和業務鍵的數據庫中,可能非常復雜(在計算機術語中),可能包含多個列,還可能導致性能問題(比較字符串與比較數字不同,比較多列比比較一列效率低),但最糟糕的是,它可能會隨着時間而改變。 為了解決這個問題,我們傾向於創建自己的technical key
,然后可以更輕松地被計算機使用,並且我們對它有更多的控制權,所以我們使用IDENTITY
和GUID
之類的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.