[英]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.