2012-03-16 12 views
0

私はこのMYSQL +更新ID列

CREATE TABLE IF NOT EXISTS `language` (
    `idkey` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `english_lang` text, 
    `japanese_lang` text, 
    PRIMARY KEY (`idkey`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1587 ; 

「IDKEYはただ1つのインクリメントから始まる番号であるように見えるテーブルを持っています。

'idkey'は現在削除したエントリの番号にギャップがあり、この列を書き換えて番号を付けることができないようにMySQLコマンドを実行できるかどうかを確認したいと考えました。

例:1から始まり、最後まで実行します(約1400エントリ)。それは、これらの「欠番」に記入しようとする標準慣行に反している

おかげ

+0

idkeyがプライマリキーである必要があります。通常、プライマリキーの番号を変更するのは悪い考えです。あなたがこれをやりたい理由がありますか? – Corbin

+0

テーブルは静的なテーブルで、関連するWebサイトもまだ開発中です。また、主キーは他のものとは関係しません。私がライブに行く前に注文を修正したいのですが、手作業でjapanese_langテキストフィールドがユニコードになっているので、ほとんどのエディタで手動で更新しようとすると値が失われてしまいます...また、更新には時間がかかります1400番号...ちょうどいいです...誰かがこのような列を書き直すことができる簡単なMySQLの更新コマンドを知っていることを願って... – Adam

答えて

1

。あなたは一度何かに割り当てられたと考える必要があります。これを他のものに割り当てると、特に外部キーの制約を使用せず、いくつかの悪いデータを置いている場合に、問題につながる可能性があります。

いくつかのデータをテストしていて、今すぐライブをしたい場合は、Alter Table TABLENAME AUTO_INCREMENT=1(または他の数字)を実行して自動インクリメントをリセットするか、テーブルを削除してから再作成することができます。それが生産されている場合は、リセットや「ギャップを埋める」ことをお勧めします。

完全性のために、私はあなたが挿入ステートメントにそれを含めることで通常の自動インクリメント列に特定の数値を挿入できると信じています。次の自動インクリメント番号は、指定した番号からピックアップされます。それが既に取られている場合、これはあなたに問題を引き起こすでしょう。

実際にギャップを埋めるのが最も簡単な方法は、同じ構造を持つ新しいテーブルを作成することです。次に、次のようなクエリを実行します。

INSERT INTO 
    newtable (column2, column3, column4,...) 
VALUES 
    SELECT column2, column3, column4,... FROM oldtable; 

新しいテーブルを削除して名前を変更します。隙間が埋まり、あなたの自動増分数は「正しい」場所になります。

本当に削除されたレコードからのギャップを残す必要があります。

+1

パーフェクトな答え。意味があるので(何かがそこにあった)、ギャップを埋めないでください。 –

+0

が理解していますが、テーブルは公開されておらず、キーは何も関係しません。あなたのalter tableコマンドを試してみましたが、番号付けは断片化していました.... – Adam

+0

alter tableコマンドは、指定したものにそのまま戻すので、次のIDがそこから拾い上げられます。次の空のIDは自動的に選択されません。 同じ構造で新しいテーブルを作成し、現在のテーブルからID列を差し引いたデータを挿入するのが最も簡単です。私はそれを答えに加えます。 – Ilion

0

はい、あなたはそれを行うことができます主キーは、行ごとに1つだけであり、あなたの列が自動増分であるならば手動で行うことができます。しかし、あなたは行のenteryを求めていますが、構文はテーブルの作成に関連しています。