在您只需要1列作为键的表中,并且该列中的值可以是整数,当您不应使用标识字段时?
相反,在同一个表和列中,何时会手动生成其值,并且不会为每条记录使用自动生成的值?
我想当表中有大量插入和删除时会出现这种情况。我对吗?还有什么其他情况?
答案 0 :(得分:10)
如果您已经确定了Great Primary Key Debacle的代理方,那么我找不到使用身份密钥的单一原因。通常的替代方案是guids(它们有许多缺点,主要来自大小和随机性)和应用程序层生成的密钥。但是在应用程序层中创建代理键比看起来有点困难,也不包括非应用程序相关的数据访问(即批量加载,导入,其他应用程序等)。一个特殊情况是分布式应用程序,当guids甚至顺序guid可以提供更好的网站ID +身份密钥替代..
答案 1 :(得分:5)
我想如果你要创建一个多对多链接表,其中两个字段都是foreign keys,那么你不需要一个标识字段。
现在我想象大多数ORMs期望每个表中都有一个标识字段。一般来说,提供一个是一个好习惯。
答案 2 :(得分:2)
我不确定我对你的背景有多了解,但我将你的问题解释为:
“如果我需要数据库来创建一个唯一的列(无论出于何种原因),何时不应该是一个单调递增的整数(标识)列?”
在这些情况下,没有理由使用除DBMS提供的设施之外的任何其他目的;在你的情况下(SQL Server?),这是一个身份。
除了:
如果您需要将表与来自其他来源的数据合并,请使用GUID,这将防止重复键发生冲突。
答案 3 :(得分:1)
如果您需要合并数据库,那么如果您不必重新生成密钥,则会更容易。
答案 4 :(得分:1)
一个不想要身份字段的情况是一对一的关系。辅助表的主键与主表的值相同。在这种情况下拥有身份字段的唯一原因似乎是满足ORM。
答案 5 :(得分:0)
在插入标识列时,您不能(通常)指定值,因此,例如,如果将“id”列指定为标识,则以下SQL将失败:
INSERT INTO MyTable (id, name) VALUES (1, 'Smith')
为了执行这种插入,您需要为该表启用IDENTITY_INSERT - 这不是正常的,并且只能在任何时间点在数据库中最多使用1个表。 / p>
答案 6 :(得分:0)
如果我需要代理,我会使用IDENTITY列或GUID列,具体取决于对全局唯一性的需求。
如果存在自然主键,或者主键被定义为其他外键的唯一组合,那么我通常没有IDENTITY,也不会将其用作主键。
有一个例外,它是我使用审计触发器跟踪的快照配置表。在这种情况下,通常有一个逻辑“主键”(通常是快照的日期和行的自然键 - 如行成为配置记录的成本中心或gl帐号),而不是使用自然“主键”作为主键,我添加一个IDENTITY并使其成为主键,并在日期和自然键上创建唯一的索引或约束。虽然理论上日期和自然键不应该改变,但是在这些表中,如果用户这样做而不是添加新行并删除旧行,我想要审计(这反映了对由其主键标识的行的更改) )真正反映行中的变化 - 不是键的消失和新键的出现。
答案 7 :(得分:0)
我最近在C#中实现了一个可以为小说编制索引的后缀Trie,然后允许搜索非常快速地完成,与搜索字符串的大小成线性关系。部分要求(这是家庭作业)是使用离线存储,所以我使用了MS SQL,并且需要一个结构来表示表中的节点。
我最终得到了以下结构:NodeID字符ParentID等,其中NodeID是主键。
由于两个主要原因,我不希望将其作为自动增量标识来完成。