繁体   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