是否有理由让整数主键列不是Identity列?

时间:2016-07-12 20:17:35

标签: sql-server database-design primary-key identity

我遇到了一个问题,我需要定期将记录插入表中,但整数主键列不是标识列。如果是这样,插入记录并让它们自动增加以保持唯一性将很容易。但是,我不能使主键列成为标识列,而不会导致应用程序中出现错误,这些错误仍然有时用于完成我正在做的事情。您是否有理由想要一个整数主键而不将该列作为标识列?我对此有点新意,只是想知道为什么有人会以这种方式构建一个表。

编辑添加:我已经完成了一些谷歌搜索和研究,我了解他们的差异和目的,但我找不到任何关于你想要使用的原因它们在这个特定的实例中一起,甚至以你不可能的方式创建你的表/应用程序。

2 个答案:

答案 0 :(得分:2)

对我来说,IT似乎是一个糟糕的数据库设计,表应该有一个主键,您可以使用它来搜索和排序例如用户名作为主键, 没有自动增量的整数主键是错误的设计

答案 1 :(得分:1)

  

是否有理由让整数主键列不是Identity列?

如果通过"身份"你的意思是(自动递增为)代理,即组成DBMS,然后是:

-- ticket #N is held by person P
lotto(N, P) -- PK(N)

surrogate只是一个名称/标识符("在日常意义上标识")用于DBMS任意挑选的内容,例如用户" 3508218",而不是,例如" asp8811"或者"八十八"或" Texas"。请注意,他们是DBMS外部存在的系统中的代理("无意义")。 (虽然有些人不会将系统生成的这样的名称/标识符称为代理,如果它在系统外可见的话。)

PK / UNIQUE只是说列集的子行值在表中是唯一的。这里N 具有"含义"即,这是一个事物的名称/标识符,DBMS无法控制选择。事实上,如果票证只能由一个人持有,则P也是候选键(PK / UNIQUE),无论名称/识别人的价值(无论何种类型)都是代理人。

每个基表和中的每个 PK / UNIQUE 或超集

查询结果命名/标识某些类的东西。即任何类型的任何列都可以命名/识别事物(对于它们是1:1或M:1),无论它是否是候选键(PK / UNIQUE)。所以整数(和任何其他类型或类型集)主键(和UNIQUE)列(和列集)(和超集)遍布命名/识别,而不是代理和是否它们是候选钥匙。