自動インクリメントの主キーを既存のテーブルに挿入する


157

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


2
alter tableキーを追加することは簡単にできますが、MySQLはまだIDがないフィールドのIDを生成しません。既存のフィールドを手動で更新してから、新しいauto_incrementが正しいオフセットで始まることを確認する必要があります。デフォルトは「1」で、いずれにしても重複キーエラーが発生します。
Marc B

3
@MarcB私はテストしたところ、実際には既存の行のIDが1から始まりました
Michael

回答:


253

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

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

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


1
うん、これは私の経験でした。auto_increment IDを入力するために別のスクリプトを実行する必要があることを決して覚えていない...
Mike Purcell

1
笑ありがとう。私の悪い。緑のマークは、実装が簡単なため、あなたのためのものです。:D
FlyingCat 2012年

53
最初の列にするには、FIRST例を使用しますALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
@Nikkie SQLiteのメカニズムはかなり異なります。ここに提案があります。stackoverflow.com
questions / 946011 / sqlite

1
@WijaySharma自動インクリメントで行を作成し、それをIDですぐに取得する必要LAST_INSERT_ID()がある場合、MySQLはその値SELECT * FROM table_name WHERE id = LAST_INSERT_ID()を提供し、ほとんどのプログラミング言語APIは、アプリケーションコードでその値を返す関数/メソッドを提供します。
Michael Berkowski、2018年

51

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

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

1
何をしないFIRST終わりでしょうか?
認知症の

1
新しいid列がテーブルの最初ではなく最後になり、これがデフォルトの動作です。
fmalina 2015年

うまくいきました!ありがとう!
Majedur Ra​​haman、

4

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

$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選択するは、更新時に同じでなければならないことに注意してください。


4

私のようなMultiple primary key definedエラーが発生する人のために:

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

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


2

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

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

2

これらの手順を適応させて、既存の非インクリメンタル主キーを持つテーブルを取得し、テーブルにインクリメンタル主キーを追加して、以下を使用して、古い主キーと新しいキーの両方を複合主キーとして新しい複合主キーを作成することができましたコード:

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フィールドが存在し、期待どおりに主キーのすべての数値が含まれます。上部の「DROP TABLE」を使用すると、これを繰り返し実行して、バリエーションを試すことができます。

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

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

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


0

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


0

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

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828

0

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


0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;

ここでtableNameはテーブルの名前です。

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

中程度は、既存の主キーのデータ型です

AUTO_INCREMENT null以外の後にauto_incrementを追加する必要があります

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

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


1
編集して説明を追加すると便利です。
Shashanth 2018

-1

PHPを記述して、既存のフィールド(この例では名前)を変更して主キーにする方法は?もちろん、テーブルに「id」フィールドを追加することはありません。

このテーブルは現在作成されています-見つかったレコードの数:4名VARCHAR(20)はい品種VARCHAR(30)はい色VARCHAR(20)はい重量SMALLINT(7)はい

これは求められる最終結果です(表の説明)-

見つかったレコードの数:4名前VARCHAR(20)いいえPRI品種VARCHAR(30)はい色VARCHAR(20)はい重量SMALLINT(7)はい

これを取得する代わりに-

見つかったレコードの数:5 id int(11)いいえPRI名VARCHAR(20)はい品種VARCHAR(30)はい色VARCHAR(20)はい重量SMALLINT(7)はい

試した後

$ query = "ALTER TABLE racehorses ADD id INT NOT NULL AUTO_INCREMENT FIRST、ADD PRIMARY KEY(id)";

これを取得する方法?-

見つかったレコードの数:4名前VARCHAR(20)いいえPRI品種VARCHAR(30)はい色VARCHAR(20)はい重量SMALLINT(7)はい

つまり、INSERT / ADDなど。最初のフィールドレコードへの主キー(前述のように、追加の「id」フィールドを追加しない場合)。

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