0

データベース移行用のスクリプトを作成しようとしていますが、疑問があります。多くのレジスタと整数型のキーを持つテーブルがあります。このキーは自動インクリメンタルで、'1' インデックスから始まります。

問題は、このインデックスが新しいデータベースのデフォルト値で占有されなければならないことです。したがって、データベース行をループして、各インデックスを 1 つずつインクリメントし、最初の場所を空白のままにして値を挿入したいと考えています。私はこの声明で試しました:

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

ただし、最初から各インデックスを更新しようとするため、最初のインデックスを '2' に変換しようとすると、2 番目のインデックスが既に使用されていることがわかり、作成できません。

これは MyIsam データベースであり、各外部キーも 1 つずつ更新する必要があるため、1 つずつ増やすことが重要です。私はMySQLを使用しています。

手を貸してください!

4

1 に答える 1

1

最も簡単な方法は 2 つあります。ターゲット テーブルにすべてを挿入した後、2 パスの更新を行います。

最初に、テーブル内の最高の番号を確認し、それを 1 つ増やしてトップ番号として記憶します。

次に、topnumber から始まる増分番号にすべてを更新します。最後に、最初のシードが何であれ、レコードごとに 1 つずつインクリメントして、すべてを更新します。

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

トップナンバーが11になる

最初のパスの後、データは次のようになります。

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

2 回目のパスの後 (最初の数が 7 であると仮定)、データは次のようになります。

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

アップデート

または、数値を増分値に更新する代わりに、最初のパスですべての初期値に記憶されている上位の数値を追加することもできます (したがって、上記のサンプル テーブルは、最初の更新後に次のようになります。

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

)、2 回目のパスでは、すべての数値を以前に格納された最上位の数値だけ減らし、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 に答える