2011-06-06 55 views
4

我在想如果有人能幫助我。使用ALTER時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` 

也可以自行工作。

我不明白爲什麼當兩個在一個查詢組合時,它不起作用,並說'創建'不存在。我知道它肯定存在。

請注意,我並不擔心'創建'的更改列,它是由MWB在比較和準備同步時生成的。但只是想知道爲什麼這兩個行爲不能被置於一個查詢。

我使用MySQL 5.5.8

更新

實際上,我可以做多的條款沒問題。我一直在其他桌子上做得很好。

我忘了提這個。但是,當我刪除後部分它的作品。

所以這不起作用:

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` 

回答

1

Documentation

可以發出多個ADD,ALTER,DROP和CHANGE子句在單個ALTER TABLE語句中,用逗號分隔。這是標準SQL的MySQL擴展,每個ALTER TABLE語句只允許每個子句中的一個。例如,要在一條語句中刪除多個列,請執行以下操作:

ALTER TABLE t2 DROP COLUMN c,DROP COLUMN d;

所以你只獲准發行

ALTER TABLE T改變......,更改...

不不同的修飾語句的組合。 不知道,如果5.5。8雖然改變了這種行爲。

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`;