web-dev-qa-db-ja.com

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

現在、次のMySQLテーブルがあります:Employees (empID, empName, department);

テーブルを次のように変更したい:Employees (empID, department, empName);

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

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

176
Sumit Gupta

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のドキュメント を参照してください。

300
Ted Hopp

列の位置を変更します。

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;
60
Igor Kostin

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

もちろん、これはすべて完全に良いトップアンサーのクエリを作成するだけですが、GUIファンは代替案を高く評価するかもしれません。

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

11
Matt Bracewell

製品の後半の段階で導入された列に対して、10以上のテーブルでこれを実行する必要がありました。そこで、すべての「関連する」テーブルに対してalterコマンドを生成するために、この簡単な乱雑なスクリプトを書きました。

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);
1
uchamp