web-dev-qa-db-ja.com

既存のテーブルに自動増分主キーを挿入します

主キーもauto_increment列もないテーブルを変更しようとしています。私は主キー列を追加する方法を知っていますが、データを主キー列に自動的に挿入できるかどうか疑問に思っていました(DBにすでに500行あり、IDを与えたいが、手動でそれをしたくない) 。何かご意見は?どうもありがとう。

144
FlyingCat

ALTER TABLE列を追加するPRIMARY KEYステートメントは、テストで正しく機能します。

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

テスト目的で作成された一時テーブルで、上記のステートメントはAUTO_INCREMENTid列を作成し、1から始まるテーブル内の既存の各行に自動インクリメント値を挿入しました。

228

id、noなどの自動インクリメントの列がない場合、次のクエリを使用して追加できます。

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

列がある場合は、次のクエリを使用して自動インクリメントに変更します。

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY
43
php

Multiple primary key definedエラーが発生するような私の場合:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

MySQL v5.5.31では、これによりid列が主キーとして設定され、各行に増分値が入力されました。

4
reflexiv

はい、このようなことはそれを行うでしょうが、最高ではないかもしれませんが、バックアップを作成したいかもしれません

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

選択したany_fieldは、更新時に同じでなければならないことに注意してください。

3
Grigor

私が見つける最も簡単で迅速なのはこれです

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);
2
Dave

これらの命令を適応させるには、既存非増分主キーを持つテーブルを取り、増分主キーをテーブルに追加し、古いキーと新しいキーの両方で新しい複合主キーを作成しました次のコードを使用した複合主キー:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

これが完了すると、_USER_IDフィールドが存在し、主キーのすべての数値が期待どおりになります。上部の「ドロップテーブル」を使用すると、これを何度も実行して、バリエーションを試すことができます。

私が仕事をすることができなかったのは、USER_IDフィールドを既に指している着信外部キーがある状況です。別のテーブルから受信する外部キーを使用して、より複雑な例を実行しようとすると、このメッセージが表示されます。

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

ALTERテーブルを実行する前にすべての外部キーを破棄し、その後それらを再構築する必要があると思います。しかし今のところ、他の人がこの状況に遭遇した場合に備えて、このソリューションを元の質問のより挑戦的なバージョンに共有したかったのです。

2
drchuck

ALTER TABLE tableName MODIFY tableNameIDMEDIUMINT NOT NULL AUTO_INCREMENT;

ここでtableNameはテーブルの名前、

tableNameプライマリである列名は変更する必要があります

MEDIUMINTは、既存の主キーのデータ型です

AUTO_INCREMENT nullではない後にauto_incrementだけを追加する必要があります

主キーをauto_incrementにします......

これが役に立てば幸いです:)

0

私は同じ問題に直面していたので、主キーのフィールドを削除してから再作成し、自動増分であることを確認しました。それは私のために働いた。他の人にも役立つことを願っています

0
Humphrey

次のコマンドを使用して、シーケンス番号を持つことができる既存のテーブルに新しい主キー列を追加できます。

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
0
Nagesh Hugar

テーブルをエクスポートし、テーブルを空にして、一意のINTとしてフィールドを追加し、それをAUTO_INCREMENTに変更してから、以前にエクスポートしたテーブルを再度インポートします。

0
David C