主键被移位

时间:2013-02-07 13:06:03

标签: sql database

背景资料

出于某种原因,当从xml将大量数据插入到多个表中时,我的主键被移位了偏移..(可能是因为多次尝试失败:P)

我有两个表.. tableA和tableB。他们是一对一的关系。 tableA是父表,并且具有主键列...比如DataIndex。

现在DataIndex就像这样......

  

685,686,687 ......等等。

和子表中存在的相应值,即TableB是相同的。

问题

如何将值向上移动,以便DataIndex从1,2,3开始......依此类推;在两个表中?

3 个答案:

答案 0 :(得分:1)

我假设主键实际上是一个标识列,在插入时会自动递增。您需要做的是“重新设置”标识列。您可以通过重命名表,使用原始名称创建重复表,然后将旧表中的数据插入新表(主键字段将被重置并将再次从1自动递增)来完成此操作。在进行插入时,请确保将旧的主键值作为附加列包含在其他表中以供参考。

要匹配相关表格,您只需执行UPDATE并使用旧主键值加入新表:

UPDATE tableB SET
   PRIMARYKEYCOLUMN = tableA.PRIMARYKEYCOLUMN
FROM tableA
WHERE
   tableA.OLDPRIMARYKEYCOLUMN = tableB.PRIMARYKEYCOLUMN

答案 1 :(得分:0)

  1. 删除PK
  2. 浏览有关DB CURSOR的记录或编写任何语言的脚本,然后阅读并更改ID
  3. 恢复PK
  4. 为PK
  5. 设置正确的身份种子

    更改种子可能涉及标识列删除和重新创建。

答案 2 :(得分:0)

我会做以下事情:

  1. 构建指向PK的外键列表;
  2. ALTER所有FK,添加ON UPDATE CASCADE子句。此步骤可能对某些数据库不起作用,您可能需要再次DROPCREATE约束;
  3. 查找最小的当前PK值,例如:SELECT min(id) FROM tableA;
  4. 刷新PK值:UPDATE tableA SET id = id - min_id + 1;
  5. 删除ON UPDATE CASCADE子句。
  6. 请注意,根据tableA大小和您正在使用的数据库引擎,完全重建表可能更快更容易,以避免数据文件膨胀。