2017-01-24 2 views
1

これはやや奇妙ですが、作業中に何度も気づいています。私は、auto_increment制約の列名 'id'があるテーブルを持っています。この列(つまりid)の位置を変更しようとすると、auto_increment制約が削除されます。私は以下の画像とクエリを提供しました。この操作は、mysqlデータベースで実行されます。データベース内の列の位置を変更すると自動インクリメントの制約がなくなります

オリジナルテーブル、 enter image description here

クエリ:クエリの後alter table login_client modify id int(11) first;

、2番目の画像で見ることができるように enter image description here

。制約auto_incremntはただ消えました。

答えて

1

まずauto_incrementDefault Valueのような列の余分な属性です。

いずれの表にもmodify columnがある場合は、列のすべての属性を追加する必要があります。

alter table login_client modify id int(11) auto_increment first; 
+0

これを行う理由は何ですか? mysqlがauto_increment属性を削除しない場合、どのような影響がありますか? – WeAreRight

+2

ALTER TABLEは、元のテーブルの一時コピーを作成します。CHANGEまたはMODIFYを使用する場合、column_definitionには、PRIMARY KEYまたはUNIQUEなどの索引属性以外の新しい列に適用する必要があるデータ型およびすべての属性を含める必要があります。元の定義に存在するが、新しい定義には指定されていない属性は、繰り越されません。 –

2

は、ドキュメントを見てください:

https://dev.mysql.com/doc/refman/5.7/en/alter-table.html

それは言う:

あなたがCHANGEを使用するか、または変更すると、column_definitionは、データ型とに適用するすべての属性を含める必要がありますPRIMARY KEYやUNIQUEなどの索引属性以外の新しい列。

これは仕様です。したがって、この方法で列を変更する場合は、適用する属性を再作成する必要があります。 AUTO_INCREMENTは技術的には属性であり、制約ではないことに注意してください。あなたはAUTO_INCREMENTを再指定することができます

はこのように、あなたのコマンドに非常に簡単に属性:

alter table login_client modify id int(11) auto_increment first; 
+0

私はこの事実を知らなかった。これをやる理由は何ですか? – WeAreRight

+0

いいえ、私はMySQLの開発者ではありません。おそらく、技術的な理由がバックグラウンドにあるのかもしれません。実際には、列がドロップされて再作成されたり、何かが発生したりします。私が知る限り、属性を再指定する必要があります。現在のテーブル定義の属性がわかっているので、それをコマンドに追加することは難しくありません。私は答えを編集して例を挙げました。 – ADyson

+0

@ JoneDotosvkyもしAUTO_INCREMENTを省略しても、それはカラム上でアクティブに保たれます。新しい特別なステートメントを作成することなく、あなたはそれをどのように削除しますか? – DCoder

0

これを試してください。 これは、指定されたフィールドの自動インクリメントを行います。

alter table login_client modify id int auto_increment 
関連する問題