重建/刷新我的表的PK列表 - 数字上的差距

时间:2014-06-26 18:12:03

标签: sql sql-server primary-key

我已完成对sql server management studio 2012中数据库表的所有更改,但现在由于编辑,我在某些值之间存在很大差距。 有没有办法保存我的数据,但是将所有ID从1重新分配到我的上一个值?

我想清理这个,因为我使用这些值填充下拉列表,然后我假设我的下拉列表索引和表的ID匹配,我与我的数据库进行交互,但现在情况并非如此。

我目前的数据库与7到28之间有很大的差距,我想将所有内容从28及以上转移到8,9,10,11等等...以便我的数据库与1之间没有差距然后继续。

enter image description here

如果解决方案很棘手,请给我一些步骤,因为我不熟悉SQL。

谢谢!

3 个答案:

答案 0 :(得分:4)

是的,有很多方法可以在自动生成的序列中“缩小间隙”。你说你是SQL的新手,所以我假设你也是关系概念的新手。以下是我给你的建议:不要这样做。

ID字段是代理键。在使用它们时必须注意的代理人有几个方面,但我要给你留下深刻印象的是,

-- A surrogate key is used to make the row unique. Other than the guarantee that
-- the value is unique, no other assumptions may be made concerning the value.
-- In particular, no meaning may be derived from the value as to the contents of
-- the row or the row's relationship to any other row.

您设计的应用程序内置了关键字段值的假设(它们将是连续的)。它已经给你带来了问题。每次更改表格时,您真的想要通过这个吗?并且假设未来的功能要求您根据用户选择的选项过滤掉一些选项?或者让用户指定项目的顺序?不容易。那么解决方案是什么?

您可以在下拉列表中创建包含键值的其他(不可见)字段。当用户进行选择时,使用该索引获取选择的键值,然后然后转到数据库并获取所需的任何其他数据。如果您从整个表中填充列表,或者根据某些尚未知的过滤条件选择一些列表或以任何方式更改顺序,这将有效。

中提琴。无论您在表中添加和删除行的频率如何,您再也不会遇到此问题。

但是,如果你和我一样顽固(不太可能!),或者只是拒绝倾听原因和经验的悠扬声音,那么试试这个:

  • 创建一个与旧表完全相同的新表,包括自动递增PK。
  • 使用旧表中的“选择”填充新表。您可以指定任何您想要的订单。
  • 放下旧桌子。
  • 将新表重命名为旧表名。

您必须从其他表中删除并重新定义任何FK。但这整个过程 可以放在脚本中,因为如果你这样做一次,你可能会再次这样做。

现在所有的值都是连续的。直到你再次编辑表格......

答案 1 :(得分:2)

您应该重构下拉列表的代码,而不是表格的PK。

如果您不同意,可以执行以下操作之一:

  1. 插入另一个列,其中包含下拉菜单""" " " " "" 
  2. 用INT替换SERIAL会起作用,在列上创建一个唯一索引并手动填充(或以编程方式)。
  3. 删除大型ID并重新设置您的序列 - 代码取决于您的DBMS

答案 2 :(得分:0)

这种情况一直发生在我身上。如果您没有任何外键约束,那么它应该是一个简单的修复。

请记住,DELETE语句将删除记录但保持标识种子不变。 (如果我删除id#5和#5是插入的最后一条记录,那么SQL服务器仍然将标识种子值存储在" 6")。

TRUNCATING表会将身份种子重置为原始值。

INSERT_IDENTITY [TABLE] ON也可以用于以正确的顺序插入正确的数据,如果不能执行。

SELECT * 
INTO #tempTable
FROM [TableTryingToFix]

TRUNCATE TABLE [TableTryingToFix];

INSERT INTO [TableTryingToFix] (COL1, COL2, COL3, ETC)
SELECT COL1, COL2, COL2, ETC
FROM #tempTable
ORDER BY oldTableID