0

我正在尝试为数据库迁移构建脚本,但我有疑问。我有一个有很多寄存器和一个整数类型键的表。该键是自动增量的,现在从“1”索引开始。

问题是这个索引必须被新数据库中的默认值占用。所以我想循环数据库行以使每个索引递增一个,将第一个位置留空并将我的值插入其中。我试过这个说法:

UPDATE `tapp`, (
  SELECT @loop := id_App
  FROM
    tapp
  ) o
SET id_App = id_App + 1;

但是,正在尝试从头开始更新每个索引,因此当它尝试将第一个索引转换为“2”时,它发现第二个索引已经被占用并且无法成功。

增加一个很重要,因为它是一个 MyIsam 数据库,我还必须一个一个地更新每个外键。我正在使用 MySQL。

请帮我一把!

4

1 回答 1

1

最简单的方法是双重的:将所有内容插入目标表后,进行 2 次更新。

首先,您检查表中的最大数字是多少,然后将其加一并记住它作为 topnumber。

然后,将所有内容更新为递增数字,从 topnumber 开始。最后,您更新所有内容,从初始种子开始,每条记录递增 1。

number data
1      "foo"
3      "bar"
10     "snafu"

topnumber 变为 11

第一次通过后,数据如下所示:

number data
11     "foo"
12     "bar"
13     "snafu"

第二遍之后(假设您的初始数字是 7),数据如下所示:

number data
7      "foo"
8      "bar"
9      "snafu"

更新

或者,您可以在第一次通过时将记住的最高数字添加到每个初始值,而不是将数字更新为增量值(因此上述示例表在第一次更新后将如下所示:

number data
11     "foo"
13     "bar"
23     "snafu"

),并且在第二次通过时,您会将所有数字减去先前存储的顶部数字并将它们增加 1,对于我们的示例,这将导致以下结果:

number data
2      "foo"
4      "bar"
11     "snafu"

使用代码片段中的名称,整个脚本可能如下所示:

/* remember the top ID */
SET @max_id = (SELECT MAX(ID) FROM tapp);

/* increment by the top ID */
UPDATE tapp SET id_App = id_App + @max_id;

/* decrement by the top ID and increment by 1 */
UPDATE tapp SET id_App = id_App - @max_id + 1;
于 2012-05-31T10:34:08.683 回答