簡體   English   中英

我可以在同一個 ER 模型中的多個表中使用身份作為主鍵嗎

[英]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)
);

PersonidjobID不會具有相同的值並因此導致錯誤嗎?

約束通常被定義並且具有數據庫中一個表(對象)的范圍。 唯一的例外是FOREIGN KEY ,它通常具有對另一個表的REFERENCE

PRIMARY KEY (或任何UNIQUE鍵)僅在其定義的表上設置約束,並且不影響或不受其他表上的其他約束的影響。

PRIMARY KEY定義一列或一組列,可用於唯一標識一個表中的一條記錄(並且所有列都不能保存NULL ,另一方面UNIQUE允許NULL ,並且處理方式可能因不同而異數據庫引擎)。

所以是的,您可能對PersonIDJobID具有相同的值,但它們的含義是不同的。 (並且要選擇一條唯一記錄,您需要告訴 SQL Server 在哪個表中以及在該表的哪一列中查找它,這是表列表和查詢中的WHEREJOIN條件)。

查詢SELECT * FROM dbo.Job WHERE JobID = 1; SELECT * FROM dbo.Person WHERE PersonID = 1; 即使您搜索的值相同,也具有不同的含義。

您將在表上定義IDENTITY (表只能有一個IDENTITY列)。 您不需要在列上定義IDENTITY以在其中包含值1IDENTITY只是為您提供了一種為每個表生成唯一值的簡單方法。

您可以使用SEQUENCE跨表共享序列,但這不會阻止您手動將相同的值插入到多個表中。

簡而言之,列中存儲的值只是一個值,表名、列名以及業務規則和角色都會賦予它意義。


對於“每個表都需要有一個PRIMARY KEYIDENTITY的概念,我想補充一點,在大多數情況下,表中有多個(獨立)鍵。通常每個實體都有一些你可以稱之為business key的東西,即用松散的術語來說,業務(人類)用來識別某物的密鑰。這個密鑰與帶有IDENTITYPRIMARY KEY非常相似,但通常具有相同的特征。

這可以是產品的條形碼,或員工的身份證號碼,或在另一個系統(例如 HR)中生成的東西,或分配給客戶或合作伙伴的代碼。

這些business keys對人類有用,但對計算機並不總是有用,但它們可以用作PRIMARY KEY

在我們(開發人員、架構師)喜歡簡單性和業務鍵的數據庫中,可能非常復雜(在計算機術語中),可能包含多個列,還可能導致性能問題(比較字符串與比較數字不同,比較多列比比較一列效率低),但最糟糕的是,它可能會隨着時間而改變。 為了解決這個問題,我們傾向於創建自己的technical key ,然后可以更輕松地被計算機使用,並且我們對它有更多的控制權,所以我們使用IDENTITYGUID之類的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM