web-dev-qa-db-ja.com

mysqlテーブルのauto_incrementにIDを作成します(事後)

別の開発者からデータベースを取得しました。彼はどのテーブルでもauto_incrementersを使用しませんでした。それらはすべて主キーIDを持っていますが、彼はコードですべての増分を手動で行いました。

それらを今すぐAuto_incrementersに変えることはできますか?


うわー、非常に素晴らしい、ありがとう。私のテーブルの1つで問題なく動作しました。しかし、2番目のテーブル、このエラーが発生しています...「。\ DBNAME#sql-6c8_62259c」の名前を「。\ DBNAME\dealer_master_events」に変更する際のエラー

58
Gene R

たとえば、主キーはあるがAUTO_INCREMENTではないテーブルは次のとおりです。

mysql> CREATE TABLE foo (
  id INT NOT NULL,
  PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);

MODIFY列をAUTO_INCREMENTオプションで再定義することができます:

mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;

これが有効になったことを確認します。

mysql> SHOW CREATE TABLE foo;

出力:

CREATE TABLE foo (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1

2番目の列を作成して元の列を削除することなく、列の定義を変更したことに注意してください。 PRIMARY KEY制約は影響を受けません。ALTER TABLEステートメントで言及する必要はありません。

次に、挿入によって新しい値が生成されることをテストできます。

mysql> INSERT INTO foo () VALUES (); -- yes this is legal syntax
mysql> SELECT * FROM foo;

出力:

+----+
| id |
+----+
|  1 | 
|  2 | 
|  5 | 
|  6 | 
+----+
4 rows in set (0.00 sec)

これをMac OS X上のMySQL 5.0.51でテストしました。

また、ENGINE=InnoDBおよび従属テーブルでテストしました。 id列の定義を変更しても、参照整合性は中断されません。


コメントで言及したエラー150に対応するには、おそらく外部キー制約との競合です。申し訳ありませんが、テストした後、うまくいくと思いました。問題の診断に役立つ可能性のあるリンクは次のとおりです。

106
Bill Karwin

上記のどれも私のテーブルでは機能しませんでした。 0〜31543の範囲の値を持つ主キーとして符号なし整数を含むテーブルがあります。現在、1万9千以上のレコードがあります。列をAUTO_INCREMENTMODIFY COLUMN 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT)に変更し、同じステートメントでseed(AUTO_INCREMENT = 31544)を設定する必要がありました。

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544;
5

既存のデータを再インクリメントする必要がないと思うので、なぜ単純なALTER TABLEコマンドを実行してPKの属性を変更できないのですか?

何かのようなもの:

ALTER TABLE `content` CHANGE `id` `id` SMALLINT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT 

私は自分のMySQLデータベースでこのコードをテストしましたが、動作しますが、意味のある数のレコードで試したことはありません。行を変更したら、増分を他のレコードに干渉しないことが保証されている数値にリセットする必要があります。

ALTER TABLE `content` auto_increment = MAX(`id`) + 1

繰り返しますが、テストされていませんが、うまくいくと思います。

4
Stephen Walcher

これは私のために働いた(私はIDをプライマリにし、自動インクリメントを設定したかった)

他の机 table_name CHANGE idid INT PRIMARY KEY AUTO_INCREMENT;

2
user2280257
ALTER TABLE `foo` MODIFY COLUMN `bar_id` INT NOT NULL AUTO_INCREMENT;

または

ALTER TABLE `foo` CHANGE `bar_id` `bar_id` INT UNSIGNED NOT NULL AUTO_INCREMENT;

ただし、bar_idは別のテーブルの外部キーです。

an error 1068: Multiple primary key defined

これを解決するには、外部キー制約チェックを一時的に無効にします

set foreign_key_checks = 0;

上記のステートメントを実行した後、再度有効にします。

set foreign_key_checks = 1;
0
Dima Dz

はい、簡単です。 AUTO_INCREMENTカラムを追加して、データ定義クエリを実行してテーブルを更新するだけです。

既存のデータベースがある場合は、「人工的に作成された」主キーに既に存在する可能性のある外部キー関係を保持するように注意してください。

0
Alex Weinstein