【问题标题】:MySQL unknown column error when using ALTER, don't understand behaviourMySQL 使用 ALTER 时出现未知列错误,不理解行为
【发布时间】:2011-06-06 05:52:33
【问题描述】:

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

我在发出 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`

也可以单独使用。

我不明白为什么将两者组合在一个查询中时它不起作用并说“创建”不存在。我知道它肯定存在。

请注意,我并不担心“已创建”的更改列,它是由 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`

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我遇到了同样的问题。我通过在添加列之前执行更改列(或修改列)来解决它。

    在您的示例中,将给出以下 SQL 语句:

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

    【讨论】:

      【解决方案2】:

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

      我以这个问题为例。

      【讨论】:

        【解决方案3】:

        来自Documentation

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

        ALTER TABLE t2 删除列 c,删除列 d;

        所以你只能发布

        ALTER TABLE t 更改 ...,更改 ...

        不是不同修饰语句的组合。 不过,不知道 5.5.8 是否改变了这种行为。

        【讨论】:

          猜你喜欢
          • 2019-01-22
          • 2020-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-19
          • 1970-01-01
          • 2014-09-16
          相关资源
          最近更新 更多