【问题标题】:Is there a way to make another value inside ID Primary key? [duplicate]有没有办法在 ID 主键中创建另一个值? [复制]
【发布时间】:2020-11-20 03:38:25
【问题描述】:

我有一个主键,当我尝试插入一些数据时,它会自己生成,但问题是它将生成我之前删除的最后一个主键

我想在输入新数据时进行输入,生成的 id 将是 17 而不是 72 等等,我使用的是 SQL SERVER 2008,帮助:{

【问题讨论】:

  • 您为什么使用不受支持的 SQL Server 版本?
  • 没有简单的方法可以做到这一点。我建议您构建您的应用程序,不要关心该标识符是什么,因为它与表中其他记录的序列相关。这就是大多数应用程序在使用 surrogate keys 时的工作方式/应该工作方式。
  • 您可以重置 IDENTITY 值,但主键的目的是唯一标识表中的行。它不需要没有缝隙,也不需要让你的眼睛舒服。
  • 不要尝试重置 IDENTITY,根据您问题中的屏幕截图,一旦下一个值达到72,您就会遇到碰撞错误。
  • 你不需要,@RickyRezaMuhammad,所以不是没有办法,而是你不应该这样做。身份只是任意(总是升序)数字;就这样。如果您想要一个顺序值,请在从表中选择时使用 ROW_NUMBER()

标签: sql sql-server


【解决方案1】:

...但问题是它将生成我之前删除的最后一个

不要暴露你的主键。这是个坏主意。

主键是内部唯一的行标识符。他们不应该性感或好看。如果你在乎它的价值,那么这意味着你想以某种方式将它的价值暴露给外部世界,这是一个非常糟糕的主意;如果您这样做,您将在不同应用程序的其他地方将此密钥转换为自然密钥,这可能成为短期、中期和长期维护的昂贵依赖项。

解决方案?如果你真的很在意格式、编号,又想公开PK,那就在表上创建一个辅助键[column]。这个可以自动生成,具有您喜欢的任何值或格式。您可以随意将其公开给任何其他应用程序,甚至是最终用户。

【讨论】:

    【解决方案2】:

    可以在表格上设置IDENTITY_INSERT ON,插入17和对应的值。 Read Identity_insert on MSDN。还要确保将来不会由于现有的身份设置而发生任何冲突。

    在这种情况下,您必须重新设定身份。

    您无法更新标识列。您必须将其插入新鲜的。

    下面的示例代码

    create table #table (id int identity(1,1), name varchar(30))
    
    insert into #table
    values('A'),('B')
    
    SELECT * FROM #TABLE
    
    SET IDENTITY_INSERT #table ON
    
    insert into #table(id,name) values(8,'C')
    
    SET IDENTITY_INSERT #table OFF
    
    SELECT * FROM #table
    
    
    +----+------+
    | id | name |
    +----+------+
    |  1 | A    |
    |  2 | B    |
    |  8 | C    |
    +----+------+
    
    

    【讨论】:

    • 据我了解,他们有一个写入该表的应用程序,并且他们希望在插入新记录时“填充”缺失的键。这个一次性查询并不能解决这个问题。您必须为每次插入运行它,这本身就有很多问题。
    • @CodeCaster,据我从 OP 了解到,他想在身份列中插入特定的 PK 值。我认为这只是一次。我不明白,是否从他的申请中持续需要。他没有提过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多