【问题标题】:Alter MySQL table to add comments on columns更改 MySQL 表以在列上添加注释
【发布时间】:2011-01-10 20:52:30
【问题描述】:

我一直在检查MySQL Documentation for ALTER TABLE,它似乎不包含向列添加或修改评论的方法。我该怎么做?

-- for table
ALTER TABLE myTable COMMENT 'Hello World'

-- for columns
-- ???

【问题讨论】:

    标签: mysql alter-table


    【解决方案1】:

    数据库中所有字段的脚本:

    SELECT 
    table_name,
    column_name,
    CONCAT('ALTER TABLE `',
            TABLE_SCHEMA,
            '`.`',
            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 IN ('CURRENT_TIMESTAMP', 'CURRENT_TIMESTAMP()', 'NULL', 'b\'0\'', 'b\'1\''), 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 编辑器中打开它

    注意:如果您愿意,可以只改进为一张桌子

    @Rufinus 提供的解决方案很棒,但如果你有自动增量,它会破坏它。

    【讨论】:

    • 根据没有足够代表发表评论的新用户,dump.aux_comment, 需要为column_comment,。你介意检查一下是不是真的吗?
    • 对错误感到抱歉。
    • 当然,如果你有一个id auto_increment,你需要做ALTER TABLE MODIFY id INT NOT NULL AUTO_INCREMENT COMMENT 'id of user';。这不会破坏自动增量。
    • @workdreamer 我指的是 Rufinus 解决方案,您说它可能会破坏自动增量。不,给定的解决方案不会破坏它。
    • 太棒了!
    【解决方案2】:

    信息架构不是处理这些事情的地方(请参阅 DDL 数据库命令)。

    添加注释时需要更改表结构(table cmets)。

    来自 MySQL 5.6 文档:

    INFORMATION_SCHEMA 是每个 MySQL 实例中的一个数据库,该位置 存储有关 MySQL 的所有其他数据库的信息 服务器维护。 INFORMATION_SCHEMA 数据库包含几个 只读表。它们实际上是视图,而不是基表,所以有 没有与之关联的文件,并且您无法设置触发器 他们。此外,没有同名的数据库目录。

    虽然您可以选择 INFORMATION_SCHEMA 作为默认数据库 使用 USE 语句,只能读取表的内容,不能读取 对它们执行 INSERT、UPDATE 或 DELETE 操作。

    Chapter 21 INFORMATION_SCHEMA Tables

    【讨论】:

      【解决方案3】:

      您可以使用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 语句中使用MODIFYCHANGE 子句时,我建议您从SHOW CREATE TABLE 语句的输出中复制列定义。这可以防止您因没有意识到需要将其包含在MODIFYCHANGE 子句中而意外丢失列定义的重要部分。例如,如果您 MODIFY 一个 AUTO_INCREMENT 列,则需要在 MODIFY 子句中再次显式指定 AUTO_INCREMENT 修饰符,否则该列将不再是 AUTO_INCREMENT 列。同样,如果列定义为NOT NULL 或具有DEFAULT 值,则在对列执行MODIFYCHANGE 时需要包含这些详细信息,否则它们将丢失。

      【讨论】:

        【解决方案4】:

        根据文档,您只能在创建表时添加 cmets。所以必须要有表定义。一种使用脚本自动读取定义并更新 cmets 的方法。

        参考:

        http://cornempire.net/2010/04/15/add-comments-to-column-mysql/

        http://bugs.mysql.com/bug.php?id=64439

        【讨论】:

        • 这个答案是错误的(即使很繁琐,也可以在创建表后更新 cmets),并且它只链接到其他网站,所以它在 Stack Overflow 答案方面没有用。跨度>
        【解决方案5】:

        试试:

         ALTER TABLE `user` CHANGE `id` `id` INT( 11 ) COMMENT 'id of user'  
        

        【讨论】:

        • 它似乎工作正常,但有没有其他方法可以做到这一点而不包括列定义?
        • 这个解决方案可以打破自动增量。
        • 请注意,更改评论将导致表格完全重建。所以你可以选择在非常大的桌子上不使用它。
        • @MarcusPope 这是不可能的。见dba.stackexchange.com/questions/78268/…
        • @user2045006 这不是(或不再)正确,只要列定义与现有定义完全匹配。可以添加注释而不会导致表重建。
        猜你喜欢
        • 2012-06-10
        • 1970-01-01
        • 2015-07-08
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2021-12-30
        • 1970-01-01
        相关资源
        最近更新 更多