使用ALTER时MySQL未知列错误,不了解行为

时间:2011-06-06 05:52:33

标签: mysql

我想知道是否有人可以帮助我。

发出ALTER命令时,我有一种奇怪的行为。该命令来自MySQL Workbench同步,它失败了。我有一张带有字段的表:

`id`  int(11) NOT NULL AUTO_INCREMENT ,
`text`  varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,
`updated`  datetime NULL DEFAULT NULL ,
`remote_addr`  varchar(45) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL ,
`http_user_agent`  varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL ,
`user_id`  int(11) NULL DEFAULT NULL ,
`category`  varchar(20) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL ,
`created`  datetime NULL DEFAULT NULL ,
PRIMARY KEY (`id`)

我想发出ALTER命令:

ALTER TABLE `logs`
ADD COLUMN `updated` DATETIME NULL DEFAULT NULL AFTER `created`,
CHANGE COLUMN `created` `created` DATETIME NULL DEFAULT NULL AFTER `category`

我得到回应:

Unknown column 'created' in 'logs'

但是

ALTER TABLE `logs`
ADD COLUMN `updated` DATETIME NULL DEFAULT NULL AFTER `created`

独立工作,并且:

ALTER TABLE `logs`
CHANGE COLUMN `created` `created` DATETIME NULL DEFAULT NULL AFTER `category`

也可单独使用。

我不明白为什么当两者在一个查询中合并时它不起作用并且说'created'不存在。我知道它肯定存在。

请注意,我并不担心'created'的更改列,它是由MWB在比较和准备同步时生成的。但只是想知道为什么两个动作都不能放在一个查询上。

我正在使用MySQL 5.5.8

更新

我其实可以做多个条款。我一直在其他桌子上做得很好。

我忘了提这个。但当我删除AFTER部分时,它可以工作。

所以这不起作用:

ALTER TABLE `logs`
ADD COLUMN `updated` DATETIME NULL DEFAULT NULL AFTER `created`,
CHANGE COLUMN `created` `created` DATETIME NULL DEFAULT NULL AFTER `category`

但这样做:

ALTER TABLE `logs`
ADD COLUMN `updated` DATETIME NULL DEFAULT NULL,
CHANGE COLUMN `created` `created` DATETIME NULL DEFAULT NULL AFTER `category`

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。我通过在ADD COLUMN之前进行CHANGE COLUMN(或MODIFY COLUMN)解决了这个问题。

在您的示例中,将提供以下SQL语句:

ALTER TABLE `logs`
CHANGE COLUMN `created` `created` DATETIME NULL DEFAULT NULL AFTER `category`,
ADD COLUMN `updated` DATETIME NULL DEFAULT NULL AFTER `created`;

答案 1 :(得分:2)

这似乎是一个错误: http://bugs.mysql.com/bug.php?id=60650

我提交了这个问题作为例子。

答案 2 :(得分:1)

来自Documentation

  

您可以在单个ALTER TABLE语句中发出多个ADD,ALTER,DROP和CHANGE子句,以逗号分隔。这是标准SQL的MySQL扩展,它只允许每个ALTER TABLE语句中的一个子句。例如,要在单个语句中删除多个列,请执行以下操作:

     

ALTER TABLE t2 DROP COLUMN c,DROP COLUMN d;

所以你只能发出

  

ALTER TABLE t CHANGE ...,CHANGE ...

不是不同修改语句的组合。 不知道,如果5.5.8改变了这种行为,那么。