MySQLテーブルの列を移動する方法は?


207

現在、私は次のMySQLテーブルを持っています。 Employees (empID, empName, department);

テーブルを次のように変更します。 Employees (empID, department, empName);

これはALTERステートメントを使用してどのように実行できますか?

注:列の位置のみを変更します。


理由を伺ってもよろしいでしょうか?列の順序は、ほとんど審美的な問題です...
deceze

6
@decezeはおそらくそうではありません- SELECT *ステートメント内の値の順序を定義します。(当然のことながら、値の順序が重要な場合は、ステートメントにそれらを明示的にリストする必要がありますが、おそらくOPはここでは完全に制御できません。)
Ted Hopp '24

1
私はそれが何にも影響を与えないことを知っています。元のテーブルには多くの列があるので、最後に追加された3つの列を追加しました。ただし、SELECTステートメントを使いやすくするために、3-4-5の位置に表示してほしい
sumit '24 / 07/11

6
@iSumitG:もAFTER columnで使用できることにも注意してくださいALTER TABLE ADD column。(次回、いくつかのフィールドを追加します。)
ypercubeᵀᴹ

2
mysqlダンプをロードする場合、値への挿入を使用します。したがって、たとえば、prodからdevにデータをロードしていて、列が順不同である場合、エラーが発生します。そのため、これを実行する必要があります。
Hooray Im Helping

回答:


345

empNameがVARCHAR(50)列の場合:

ALTER TABLE Employees MODIFY COLUMN empName VARCHAR(50) AFTER department;

編集

コメントごとに、これを行うこともできます:

ALTER TABLE Employees CHANGE COLUMN empName empName VARCHAR(50) AFTER department;

の繰り返しempNameは意図的なものであることに注意してください。MySQLに同じ列名を保持するように指示する必要があります。

両方の構文バージョンがMySQLに固有であることに注意してください。たとえば、PostgreSQLや他の多くのDBMSでは機能しません。

別の編集:コメントで@Luis Rossiが指摘したように、変更された列定義をAFTER修飾子の直前に完全に指定する必要があります。上記の例にはVARCHAR(50)が含まれていますが、他の特性(NOT NULLまたはデフォルト値など)が必要な場合は、それらも含める必要があります。詳細については、上のドキュメントを参照ALTER TABLEしてください。


6
ちょうどノート:MODIFYは、バージョン4までサポートされていません
ERRE EFE

4
構文では列名を変更する必要がある場合があるため、列名を繰り返す必要があります。例:ALTER TABLE Employees CHANGE COLUMN empName empName varchar(50)AFTER department;
brianjcohen

変更した順序はデータベースSQLダンプに反映されないことに注意してください。
スケーリー2015年

3
@SalehEnamShohag-はい、ドキュメントによると、COLUMNキーワードはALTER TABLEステートメントではオプションです。ステートメントを読みやすくするために、私はそれを使用することを好みます。
テッドホップ2016年

1
私の場合は問題なく動作します。私の場合、列をと定義する必要がありましたNOT NULL DEFAULT 1。これは、例の列タイプの直後に行われますVARCHAR(50)
Luiz Rossi

67

列の位置を変更:

ALTER TABLE Employees 
   CHANGE empName empName VARCHAR(50) NOT NULL AFTER department;

これを最初の位置に移動する必要がある場合は、ALTER TABLE CHANGE [COLUMN]クエリの最後にFIRSTという用語を使用する必要があります。

ALTER TABLE UserOrder 
   CHANGE order_id order_id INT(11) NOT NULL FIRST;

24
最初の位置に移動する方法を言及することは非常に
便利でした

2
これが大きなテーブルでどのように機能するか考えていますか?メタデータを変更するだけですか、それとも実際にディスク上のデータを再編成する必要がありますか?
2015年

6
気にしないで、390万行のテーブルで試して自分の質問に答えました。約2分かかりました。したがって、メタデータを交換するだけではありません。
キップ

14

phpMyAdminは、このためのGUIをテーブルの構造ビュー内に提供します。移動する列をチェックして選択し、列リストの下部にある変更アクションをクリックします。次に、すべての列プロパティを変更できます。画面の右端に「列の移動」機能があります。

もちろん、これは完全に優れたトップアンサーでクエリを構築するだけですが、GUIファンは代替手段を高く評価するかもしれません。

私のphpMyAdminバージョンは4.1.7です


1
質問では、「ALTERステートメントを使用してこれをどのように実行できるか」を具体的に尋ねます。MySQLを実行しているすべての人がphpMyAdminを使用するわけではありません。
カレブ2015年

3
phpMyAdminなどのGUIツールからのクエリ出力を観察することで、コマンドラインで現在行っていることの多くを学びます。この投稿で、PPLがこれに基づいて適切な数の投票を獲得できることを嬉しく思います。1人がこれを見て、快適な環境で仕事を終え、少し学び、次に進みます。

このアクションでは、phpmyadmiはアクションを実行するコマンドを表示しません。見つかりません
Tebe

2
うわー、トリックを実行し、OPがALTER SQLに要求した回答を補完する代替ソリューションに対する怒りは非常に大きいです。
エウェン2017

1

製品の後半に導入された列に対して、10以上のテーブルでこれを実行する必要がありました。したがって、すべての「関連する」テーブルの変更コマンドを生成するために、この簡単で整頓されたスクリプトを記述しました。

SET @NeighboringColumn = '<YOUR COLUMN SHOULD COME AFTER THIS COLUMN>';

SELECT CONCAT("ALTER TABLE `",t.TABLE_NAME,"` CHANGE COLUMN `",COLUMN_NAME,"` 
`",COLUMN_NAME,"` ", c.DATA_TYPE, CASE WHEN c.CHARACTER_MAXIMUM_LENGTH IS NOT 
NULL THEN CONCAT("(", c.CHARACTER_MAXIMUM_LENGTH, ")") ELSE "" END ,"  AFTER 
`",@NeighboringColumn,"`;")
FROM information_schema.COLUMNS c, information_schema.TABLES t
WHERE c.TABLE_SCHEMA = '<YOUR SCHEMA NAME>'
AND c.COLUMN_NAME = '<COLUMN TO MOVE>'
AND c.TABLE_SCHEMA = t.TABLE_SCHEMA
AND c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
AND @NeighboringColumn IN (SELECT COLUMN_NAME 
    FROM information_schema.COLUMNS c2 
    WHERE c2.TABLE_NAME = t.TABLE_NAME);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.