web-dev-qa-db-ja.com

MySQLテーブルを変更して列にコメントを追加する

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'  
114
Rufinus

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を実行するときにこれらの詳細を含める必要があります。そうしないと失われます。

31
Mark Amery

データベースのすべてのフィールドのスクリプト:

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. すべてをCSVにエクスポート
  2. お気に入りのCSVエディターで開きます

注:必要に応じて1つのテーブルのみに改善できます

@Rufinusによって提供されるソリューションは素晴らしいですが、自動インクリメントがある場合、それは壊れます。

11
workdreamer

ルフィナスの答えは適切です。列の名前を変更する必要がない場合は、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操作は実行できません。

第21章INFORMATION_SCHEMAテーブル

3
mpoletto