MySQLテーブルに主キーを追加する方法は?


103

これは私が試したものですが、失敗します:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

ヒントはありますか?


11
何かが失敗したとき、何が失敗したのかを特定すること常に良い考えです:あなたはエラーメッセージを受け取りますか?どれ ?
Pascal MARTIN、2011

エラーメッセージは次のようになると思います:複数の主キーが定義されています
LMD

回答:


226

列を追加した後は、いつでも主キーを追加できます。

ALTER TABLE goods ADD PRIMARY KEY(id)

スクリプトが機能しなかった理由についてPRIMARY KEYは、単語だけでなくを指定する必要がありますPRIMARY

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

私にとってそれは言う:これは複数の主キーを定義するでしょう。私はInnoDBを使用しています。すでに3つあります。
LMD

2
私は間違いなくFIRSTAUTO_INCREMENTに置きidます。つまり、は既存のテーブルの最初の列になります。さもなければ、それは現在書かれているように表の最後に置かれます、それは単純なことをするときに少し混乱するSELECT * ...
かもしれ

新しい「id」列の最初の場所を取得する方法
TipVisor

17

既存の列

既存の列に主キー制約を追加する場合、上記の構文はすべて失敗します。

主キー制約を既存の列に追加するには、次の形式を使用します。

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
mysqlがMODIFYを適切なステートメントとして認識しない(少なくともXAMPP、InnoDBでは)
LMD

@LMDどのバージョンのmysqlを使用していますか?(注:これを投稿したときに機能していたのは知っていて、5.6だったと思いますが...確かに思い出せません)
MER

1
もしあなたにとって、私のように、それが機能しない場合は、MODIFYをCHANGEに置き換えれば機能します!
csr-nontol

12

テーブルが非常に大きい場合は、次のステートメントを使用しないでください。

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

一時テーブルのすべてのデータのコピーを作成し、テーブルを変更してからコピーします。手動で実行することをお勧めします。テーブルの名前を変更します。

rename table goods to goods_old;

主キーと必要なすべてのインデックスを持つ新しいテーブルを作成します。

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

すべてのデータを古いテーブルから新しいテーブルに移動し、キーとインデックスを無効にしてコピーを高速化します。

-これをMyISAMテーブルに使用:

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

または

-これをInnoDBテーブルに使用します。

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

最大200行のテーブルにPKを追加するには、2000秒かかります。


この答えを見つけるために検索する必要がある時間に驚いた。これらの役立つ例をありがとう。
ライアン

4

これが他の人にとって重要かどうかはわかりませんが、データベースの最初の列よりもidテーブルの方を好みます。そのための構文は次のとおりです。

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

これは、最初の回答よりもわずかに改善されています。別の位置にしたい場合は、

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH、-ft





0

これを試して、

alter table goods add column `id` int(10) unsigned primary key auto_increment

0

私にとって、構文エラーを引き起こす提案はどれも機能しなかったので、phpmyadmin(バージョン4.9.2)、(10.4.10-MariaDB)を使用して試してみてid、自動インクリメントの主キーを持つ列を追加しました。Id列は最初の要素からうまく追加されました。

クエリの出力は:

ALTER TABLE table_nameADD idINT NOT NULL AUTO_INCREMENT FIRST、ADD PRIMARY KEY(id);


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.