sql – 每个表真的需要一个自动递增的人工主键吗?

我在我7年的开发经验中看到的每个数据库中的几乎每个表都有一个自动递增的主键.为什么是这样?如果我有一张美国州的表,每个国家每个国家必须有一个唯一的名字,那么使用自动递增的主键是什么?为什么不使用状态名称作为主键?似乎是一个借口,允许重复伪装成独特的行.

对我来说这显然是显而易见的,但是再一次,没有其他人似乎正在与我达成同样的逻辑结论,所以我必须假设有错误的机会.

有什么真正的实际原因我们需要使用自动递增键吗?

解决方法

没有.

在大多数情况下,使用代理INT IDENTITY键是一个简单的选项:它可以保证为非空和100%唯一,很多“自然”键不提供 – 名称可以改变,所以SSN等等信息项目.

在状态缩写和名称的情况下 – 如果有的话,我会使用两个字母的状态缩写作为关键字.

主要关键是:

>独特(100%保证!不只是“几乎”独一无二)
> NON NULL

一个主要的关键应该是:

>如果有可能稳定(不改变 – 或至少不太频繁)

国家的两个字母的代码肯定会提供这个 – 这可能是一个自然的钥匙的候选人.一个键也应该很小 – 一个4字节的INT是完美的,两个字母的CHAR(2)列是一样的.我不会使用VARCHAR(100)字段或类似的东西作为一个关键 – 它只是太笨重,很可能会改变所有的时间 – 不是一个很好的关键候选人.

所以当你不需要自动递增的“人造”(代理)主键时,通常是一个很好的选择,因为没有自然发生的数据真的可以作为一个主键的任务,而你想避免拥有多个主列的主键 – 这些键太笨拙,效率低下.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...