61

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

それらをAuto_incrementersに変換できますか?


うわー、とても素敵です、トンに感謝します。それは私のテーブルの1つで問題なく動作しました。しかし、2番目のテーブルでこのエラーが発生しています...「。\ DBNAME#sql-6c8_62259c」の名前を「。\ DBNAME\dealer_master_events」に変更するとエラーが発生します

4

7 に答える 7

113

たとえば、主キーはあるがそうでないテーブルは次のとおりです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 に対応するには、おそらく外部キー制約との競合です。申し訳ありませんが、テストした後、うまくいくと思いました。問題の診断に役立つ可能性があるいくつかのリンクを次に示します。

于 2008-10-30T20:24:01.460 に答える
5

上記のどれも私のテーブルでは機能しませんでした。0 から 31543 の範囲の値を持つ主キーとして符号なし整数を持つテーブルがあります。現在、19,000 を超えるレコードがあります。同じステートメントで列をAUTO_INCREMENT( MODIFY 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;
于 2010-01-12T19:31:33.970 に答える
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

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

于 2008-10-30T20:11:19.443 に答える
2

これは私にとってはうまくいきました(IDをプライマリにして自動インクリメントを設定したかったのです)

ALTER TABLE table_nameCHANGE id idINT PRIMARY KEY AUTO_INCREMENT;

于 2014-02-21T21:34:00.430 に答える
0

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

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

于 2008-10-30T19:55:38.210 に答える
-1

現在の PK に一意の整数 (または一意の値) がある限り、新しいテーブルを作成し、IDENTITY INSERT ON で挿入できます。次に、古いテーブルを削除し、新しいテーブルの名前を変更します。

インデックスを再作成することを忘れないでください。

于 2008-10-30T19:54:40.927 に答える