修改MySQL表以在列上添加注释

138

我一直在查看MySQL的ALTER TABLE文档,但它似乎没有提供添加或修改列注释的方法。我该怎么做?

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

-- for columns
-- ???
5个回答

171

尝试:

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

20
看起来运行良好,但有没有其他方法可以在不包括列定义的情况下完成这项任务? - Jhonny D. Cano -Leftware-
21
这个解决方案可能会破坏自动递增。 - workdreamer
17
请注意,修改评论将导致表格的完全重建。因此,在非常大的表格上,您可以选择不使用评论功能。 - Courtney Miles
2
@MarcusPope 这是不可能的。请参见http://dba.stackexchange.com/questions/78268/updating-mysql-trigger-via-information-schema-access-denied。 - gaRex
8
只要列的定义与现有定义完全匹配,那么这种说法不是真实的(或者不再适用)。可以添加注释而不会导致表格重建。 - Torben
显示剩余8条评论

56
您可以使用修改列来完成此操作。只需...
ALTER TABLE YourTable
MODIFY COLUMN your_column
your_previous_column_definition COMMENT "Your new comment"

替换:

  • 用您的表名替换YourTable
  • 用您的评论名称替换your_column
  • 用该列的column_definition替换your_previous_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 子句中包含它。例如,如果您修改 AUTO_INCREMENT 列,则需要在 MODIFY 子句中显式指定 AUTO_INCREMENT 修饰符,否则该列将不再是 AUTO_INCREMENT 列。同样,如果该列被定义为 NOT NULL 或具有 DEFAULT 值,则在对该列进行 MODIFY 或 CHANGE 时需要包括这些详细信息,否则它们将丢失。

这将拯救许多人的生命。AUTO_INCREMENT通常被添加到主键。如果AUTO_INCREMENT丢失,那将是疯狂的。 - undefined

18

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

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 提供的解决方案很好,但如果您有自动增量,它将会破坏它。


3
根据一位没有足够声望发表评论的新用户所说,“dump.aux_comment”需要改为“column_comment”。您介意检查一下是否属实? - nhahtdh
抱歉犯了错误。 - workdreamer
当然,如果您有一个自增的id,您需要执行ALTER TABLE MODIFY id INT NOT NULL AUTO_INCREMENT COMMENT 'id of user';。这不会破坏自增。 - Having a life on a beach
@workdreamer 我指的是 Rufinus 提供的解决方案,你说它可能会破坏自动递增。不,这个解决方案不会破坏它。 - Having a life on a beach
2
真棒惊人! - Rizki Noor Hidayat Wijaya
显示剩余2条评论

4
信息模式不是处理这些事情的地方(请参见DDL数据库命令)。
当您添加注释时,需要更改表结构(表注释)。
来自MySQL 5.6文档:
INFORMATION_SCHEMA是每个MySQL实例中的一个数据库,存储有关MySQL服务器维护的所有其他数据库的信息。 INFORMATION_SCHEMA数据库包含几个只读表。它们实际上是视图,而不是基本表,因此没有与它们关联的文件,并且您无法在它们上设置触发器。此外,没有名为该名称的数据库目录。
尽管可以使用USE语句将INFORMATION_SCHEMA选择为默认数据库,但只能读取表的内容,而不能对其执行INSERT、UPDATE或DELETE操作。 第21章INFORMATION_SCHEMA表

-3

3
这个答案是错误的(即使它很繁琐,但在表创建后更新注释是可能的),而且它只链接到其他网站,因此在 Stack Overflow 答案方面并不有用。 - Lukas Eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接