現在、次のMySQLテーブルがあります:Employees (empID, empName, department);
テーブルを次のように変更したい:Employees (empID, department, empName);
ALTER
ステートメントを使用してこれを行うにはどうすればよいですか?
注:列の位置のみを変更します。
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
のドキュメント を参照してください。
列の位置を変更します。
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;
phpMyAdminは、テーブルの構造ビュー内でこのためのGUIを提供します。移動する列を選択して選択し、列リストの下部にある変更アクションをクリックします。その後、すべての列のプロパティを変更できます。画面の右端に「列の移動」機能があります。
もちろん、これはすべて完全に良いトップアンサーのクエリを作成するだけですが、GUIファンは代替案を高く評価するかもしれません。
私のphpMyAdminバージョンは4.1.7です
製品の後半の段階で導入された列に対して、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);