我一直在检查MySQL Documentation for ALTER TABLE,但它似乎没有包含向列添加或修改注释的方法。我怎么能这样做?
-- for table
ALTER TABLE myTable COMMENT 'Hello World'
-- for columns
-- ???
答案 0 :(得分:112)
尝试:
ALTER TABLE `user` CHANGE `id` `id` INT( 11 ) COMMENT 'id of user'
答案 1 :(得分:29)
您可以使用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
命令获取并逐字复制以避免任何陷阱。* < / LI>
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)
*每当您在MODIFY
语句中使用CHANGE
或ALTER TABLE
子句时,我建议您从SHOW CREATE TABLE
语句的输出中复制列定义。这可以防止您意外丢失列定义的重要部分,因为您没有意识到需要将其包含在MODIFY
或CHANGE
子句中。例如,如果您MODIFY
列为AUTO_INCREMENT
,则需要在AUTO_INCREMENT
子句中再次明确指定MODIFY
修饰符,否则该列将不再是{{ 1}}列。同样,如果列定义为AUTO_INCREMENT
或具有NOT NULL
值,则在列上执行DEFAULT
或MODIFY
时需要包含这些详细信息,否则它们将是丢失。
答案 2 :(得分:11)
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
注意:如果您愿意,可以只改进一个表格
@Rufinus给出的解决方案很棒,但是如果你有自动增量,它就会破坏它。
答案 3 :(得分:3)
Rufinus&#39;答案是恰当的。如果您不需要更改列的名称,我宁愿使用MODIFY而不是使用CHANGE。
我不同意Marcus Pope的评论。 mysql信息数据库模式或任何驻留信息模式并包含任何数据库的数据定义的地方不是处理这些事物的地方。 SGBD使用信息模式来记录对数据库执行的任何DDL命令所需的更改。为什么我们需要DDL命令?
在任何关系数据库中都有两种类型的SQL命令:DML和DDL。添加注释时,需要更改表结构。
来自MySQL 5.6文档:
&#34; INFORMATION_SCHEMA是每个MySQL实例中的数据库,该实例存储有关MySQL服务器维护的所有其他数据库的信息。 INFORMATION_SCHEMA数据库包含几个只读表。它们实际上是视图,而不是基表,因此没有与它们关联的文件,并且您无法在它们上设置触发器。此外,没有具有该名称的数据库目录。
尽管您可以使用USE语句选择INFORMATION_SCHEMA作为默认数据库,但您只能读取表的内容,而不能对它们执行INSERT,UPDATE或DELETE操作。&#34;
答案 4 :(得分:-3)
根据文档,您只能在创建表时添加注释。所以必须有表定义。使用脚本自动化它来读取定义并更新注释的一种方法。
参考:
http://cornempire.net/2010/04/15/add-comments-to-column-mysql/