我想知道是否有人可以帮助我。
发出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`
答案 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)
您可以在单个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改变了这种行为,那么。