回答:
列ALTER TABLE
を追加するステートメントPRIMARY KEY
は、私のテストで正しく機能します。
ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;
テスト目的で作成された一時テーブルで、上記のステートメントはAUTO_INCREMENT
id
列を作成し、テーブル内の既存の各行に1から始まる自動インクリメント値を挿入しました。
FIRST
例を使用しますALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
LAST_INSERT_ID()
がある場合、MySQLはその値SELECT * FROM table_name WHERE id = LAST_INSERT_ID()
を提供し、ほとんどのプログラミング言語APIは、アプリケーションコードでその値を返す関数/メソッドを提供します。
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
FIRST
終わりでしょうか?
id
列がテーブルの最初ではなく最後になり、これがデフォルトの動作です。
はい、このようなものはそれを行うでしょうが、最善ではないかもしれませんが、バックアップを作成したいかもしれません
$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
選択するは、更新時に同じでなければならないことに注意してください。
これらの手順を適応させて、既存の非インクリメンタル主キーを持つテーブルを取得し、テーブルにインクリメンタル主キーを追加して、以下を使用して、古い主キーと新しいキーの両方を複合主キーとして新しい複合主キーを作成することができましたコード:
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テーブルを実行する前にすべての外部キーを破棄し、その後それらを再構築する必要があると思います。しかし今のところ、他の人がこの状況に遭遇した場合に備えて、元の質問のより挑戦的なバージョンにこの解決策を共有したいと思いました。
次のコマンドを使用して、シーケンス番号を持つことができる既存のテーブルに新しい主キー列を追加できます。
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
ALTER TABLE tableName MODIFY tableNameID MEDIUMINT NOT NULL AUTO_INCREMENT ;
ここでtableNameはテーブルの名前です。
tableNameは、変更する必要があるプライマリである列名です
中程度は、既存の主キーのデータ型です
AUTO_INCREMENT null以外の後にauto_incrementを追加する必要があります
その主キーをauto_incrementにします......
これが役に立てば幸い:)
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」フィールドを追加しない場合)。
alter table
キーを追加することは簡単にできますが、MySQLはまだIDがないフィールドのIDを生成しません。既存のフィールドを手動で更新してから、新しいauto_incrementが正しいオフセットで始まることを確認する必要があります。デフォルトは「1」で、いずれにしても重複キーエラーが発生します。