0

10を掛けて更新する必要のある主キーフィールドがあります。

現在、私のIDは次のとおりです。

`id`
- 1
- 2
- ...
- 10
- 11
- etc.

私が試した更新を行うには:

START TRANSACTION;
UPDATE status SET id = id*10;
COMMIT;

ただし、pkの苦情があります(現在の主キーである1 * 10 = 10であるため)。

この問題をどのように解決し、この更新を行いますか?

更新:これは、更新する必要があるレガシーテーブルのために必要なものです。私はデータベース設計に関するアドバイスを探していませんが、文字通りこの更新をどのように達成するかを考えています。

4

3 に答える 3

3

主キーは、各行を一意に識別するのに役立つ必要があります...いかなる種類の順序も提供しません。主キーを操作して、他のアイテムの間にアイテムを収めようとしてはいけません。

代わりに、OrderIDこれらの行の任意の順序をハードコーディングできるようにする必要がある場合は、テーブルに列を追加することを検討してください。

于 2013-03-15T20:33:50.787 に答える
1

さて、私たちはあなたの問題に対するより巧妙な解決策を欠いていますが、あなたは

  1. 同じ構造の一時テーブルを作成します
  2. を実行しますINSERT INTO TEMP_TABLE SELECT id*10, --all other fields。これにより、IDの衝突は発生しません。
  3. 元のテーブルからすべてのデータを削除します
  4. INSERT INTO一時テーブルから元のテーブルに戻ります

重要:この前に必ずバックアップを行ってください。

于 2013-03-15T20:37:23.910 に答える
1

更新クエリでORDERBYステートメントを指定できます。

UPDATE status SET id = id*10 ORDER BY id DESC;

これにより、高い値が最初に更新されるため、競合を防ぐことができます。

于 2013-03-15T20:52:47.660 に答える