ALTER TABLEのMySQLドキュメント を確認しましたが、列にコメントを追加または変更する方法が含まれていないようです。これどうやってするの?
-- for table
ALTER TABLE myTable COMMENT 'Hello World'
-- for columns
-- ???
試してください:
ALTER TABLE `user` CHANGE `id` `id` INT( 11 ) COMMENT 'id of user'
MODIFY COLUMN
を使用してこれを行うことができます。ただ...
ALTER TABLE YourTable
MODIFY COLUMN your_column
your_previous_column_definition COMMENT "Your new comment"
代替:
YourTable
とテーブル名your_column
とコメントの名前your_previous_column_definition
列の column_definition を使用して、SHOW CREATE TABLE YourTable
経由で取得することをお勧めしますトラップを避けるためにコマンドと逐語的にコピーします。*Your new comment
に必要な列コメントを付けます。例えば...
mysql> CREATE TABLE `Example` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `some_col` varchar(255) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected (0.18 sec)
mysql> ALTER TABLE Example
-> MODIFY COLUMN `id`
-> int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Look, I''m a comment!';
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE Example;
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Example | CREATE TABLE `Example` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Look, I''m a comment!',
`some_col` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
* ALTER TABLE
ステートメントでMODIFY
句またはCHANGE
句を使用するときは常に、SHOW CREATE TABLE
ステートメントの出力から列定義をコピーすることをお勧めします。これにより、MODIFY
句またはCHANGE
句に含める必要があることを認識しないことで、カラム定義の重要な部分を誤って失うことを防ぎます。たとえば、MODIFY
列にAUTO_INCREMENT
列を使用する場合、MODIFY
句でAUTO_INCREMENT
修飾子を再度明示的に指定する必要があります。そうしないと、列はAUTO_INCREMENT
列ではなくなります。同様に、列がNOT NULL
として定義されている場合、またはDEFAULT
値を持つ場合、列でMODIFY
またはCHANGE
を実行するときにこれらの詳細を含める必要があります。そうしないと失われます。
SELECT
table_name,
column_name,
CONCAT('ALTER TABLE `',
table_name,
'` CHANGE `',
column_name,
'` `',
column_name,
'` ',
column_type,
' ',
IF(is_nullable = 'YES', '' , 'NOT NULL '),
IF(column_default IS NOT NULL, concat('DEFAULT ', IF(column_default = 'CURRENT_TIMESTAMP', column_default, CONCAT('\'',column_default,'\'') ), ' '), ''),
IF(column_default IS NULL AND is_nullable = 'YES' AND column_key = '' AND column_type = 'timestamp','NULL ', ''),
IF(column_default IS NULL AND is_nullable = 'YES' AND column_key = '','DEFAULT NULL ', ''),
extra,
' COMMENT \'',
column_comment,
'\' ;') as script
FROM
information_schema.columns
WHERE
table_schema = 'my_database_name'
ORDER BY table_name , column_name
注:必要に応じて1つのテーブルのみに改善できます
@Rufinusによって提供されるソリューションは素晴らしいですが、自動インクリメントがある場合、それは壊れます。
ルフィナスの答えは適切です。列の名前を変更する必要がない場合は、CHANGEを使用する代わりにMODIFYを使用することをお勧めします。
私は、マーカス教皇のコメントに同意しません。 mysql情報データベーススキーマ、または情報スキーマが存在し、データベースのデータ定義を含む場所は、これらのものを扱う場所ではありません。 SGBDは、情報スキーマを使用して、データベースに対して実行されたDDLコマンドに必要な変更を記録します。なぜDDLコマンドが必要なのでしょうか?
リレーショナルデータベースで使用するSQLコマンドには、DMLとDDLの2種類があります。コメントを追加するときは、テーブル構造を変更する必要があります。
MySQL 5.6ドキュメントから:
「INFORMATION_SCHEMAは、MySQLサーバーが維持する他のすべてのデータベースに関する情報を格納する各MySQLインスタンス内のデータベースです。INFORMATION_SCHEMAデータベースには、いくつかの読み取り専用テーブルが含まれます。それらに関連付けられているため、トリガーを設定できません。また、その名前のデータベースディレクトリはありません。
USEステートメントを使用してINFORMATION_SCHEMAをデフォルトのデータベースとして選択できますが、テーブルの内容を読み取ることはできますが、INSERT、UPDATE、またはDELETE操作は実行できません。