0

背景资料

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

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

现在DataIndex已经出现了这样的..

685、686、687……等等。

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

问题

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

4

3 回答 3

1

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

要匹配相关表,您需要做的就是UPDATE在旧主键值上执行并加入新表:

UPDATE tableB SET
   PRIMARYKEYCOLUMN = tableA.PRIMARYKEYCOLUMN
FROM tableA
WHERE
   tableA.OLDPRIMARYKEYCOLUMN = tableB.PRIMARYKEYCOLUMN
于 2013-02-07T13:11:40.520 回答
0
  1. 删除PK
  2. 通过 DB CURSOR 浏览记录或使用任何语言编写脚本,依次读取和更改 id
  3. 恢复PK
  4. 为 PK 设置正确的身份种子

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

于 2013-02-07T13:09:54.270 回答
0

我会做以下事情:

  1. 构建指向您的 PK 的外键列表;
  2. ALTER所有 FK,添加ON UPDATE CASCADE子句。此步骤可能不适用于某些数据库,您可能需要再次DROP进行CREATE约束;
  3. 找到最小的当前 PK 值,例如:SELECT min(id) FROM tableA;
  4. 刷新 PK 值:UPDATE tableA SET id = id - min_id + 1;
  5. 删除ON UPDATE CASCADE子句。

请注意,根据tableA您使用的大小和数据库引擎,完全重建表以避免数据文件膨胀可能会更快、更容易。

于 2013-02-07T13:25:40.793 回答