-2

主キーとしてフィールド (id 、brand、model 、os) id を持つテーブルがあります

テーブルには最大 6000 行あります

ここで、id=4012 (既に存在する) の新しいフィールドを追加し、id>4012 の id++ をインクリメントしたい

最も愚かな方法:

  1. テーブルのバックアップを作成

  2. ID >= 4012 のエントリを削除

  3. id = 4012 の新しいエントリを挿入

  4. バックアップからテーブルを復元する

愚かですが、動作します))

より美しいソリューションを探しています Thx

テーブル構造:

CREATE TABLE IF NOT EXISTS `mobileslist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `brand` text NOT NULL,
  `model` text NOT NULL,
  `os` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14823 ;

私は試します:

UPDATE mobileslist SET id = id + 1 WHERE id IN (SELECT id FROM mobileslist WHERE id >= 4822 ORDER BY id);

しかし、答えを得ました:

1093 - FROM 句で更新するターゲット テーブル 'mobileslist' を指定することはできません

4

2 に答える 2

0

1) ID の降順で一時テーブルを作成します。
2) ID = ID + 1 WHERE ID >= 4012 を設定する一時テーブルで UPDATE クエリを実行します。
3) 一時テーブル
を削除します。 4) 元のテーブルで挿入操作を実行します。

于 2013-08-05T14:16:32.723 に答える
0

4012 の位置に新しいエントリを挿入し、Id = 4012 以上にあるすべてのエントリを移動して再割り当てし、新しい ID を 1 ずつ増やしたいと考えています。これが役に立てば幸いです。

これを試して:

UPDATE <TableName>
SET 
    id = id + 1
WHERE id IN (SELECT id FROM <TableName> WHERE id >= 4012 ORDER BY id)

INSERT INTO <TableName>
    (id , brand, model , os)
VALUE
    (4012, "<BrandName>", "<Model>", "<OS>")

更新された回答:

DECLARE @MaxId INT, @Difference INT
SELECT
    @MaxId = MAX(id)
FROM mobileslist

SET @Difference = @MaxId - 4012

UPDATE mobileslist
SET
id = id + @Difference
where id >= 4012

INSERT INTO mobileslist
    (id , brand, model , os)
VALUE
    (4012, "TestBrand", "TestModel", "TestOS")

UPDATE mobileslist
SET
id = id - @Difference
where id > 4012
于 2013-08-05T14:08:00.140 に答える