MySQL alter table提供了未知的列错误

时间:2018-08-15 15:19:43

标签: mysql alter-table alter

我要重命名许多表中的一列列,并更改它们的数据类型以进行主要的系统更新,除了这个问题,我没有很多问题。

  

错误代码:1054。“工厂”中的未知列“ FactoryID”

show create table `factories`;
CREATE TABLE `factories` (
   `FactoryID` char(36) COLLATE utf8mb4_unicode_ci NOT NULL,
   `ParentFactoryID` char(36) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `Name` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `Notes` varchar(1024) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `DateTimeAdded` datetime DEFAULT NULL,
   `CountryID` smallint(5) unsigned NOT NULL,
   `ListID` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
   `Deleted` int(1) DEFAULT '0',
   PRIMARY KEY (`FactoryID`),
   UNIQUE KEY `FactoryID` (`FactoryID`),
   KEY `ParentFactoryID` (`ParentFactoryID`),
   KEY `CountryID` (`CountryID`),
   CONSTRAINT `factories[CountryID]` FOREIGN KEY (`CountryID`) REFERENCES `countries` (`CountryID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `sterling`.`factories` 
CHANGE COLUMN `CountryID` `CountryID` SMALLINT(5) UNSIGNED NOT NULL AFTER `FactoryID`,
CHANGE COLUMN `ParentFactoryID` `_OriginalFactoryID` CHAR(36) CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' NULL DEFAULT NULL AFTER `ListID`,
CHANGE COLUMN `DateTimeAdded` `__Added` TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) AFTER `__Active`,
CHANGE COLUMN `Deleted` `__Active` TINYINT(1) NOT NULL DEFAULT 1 ,
ADD COLUMN `__Updated` TIMESTAMP(6) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(6) AFTER `__Added`,
drop primary key,
change column`FactoryID` `@FactoryID`char(36)null after`__Updated`,
add column`FactoryID`binary(8)not null first,
add index`@FactoryID`(`@FactoryID`);

我是否缺少某种操作顺序?如果所有这些更改都按顺序发生,那么我不确定是什么问题,因为在任何时候都没有引用FactoryID

1 个答案:

答案 0 :(得分:1)

after所引用的列名应该是最终表中列的 new 名称。在语句中的何处更改名称都无所谓。

它实际上甚至使以下语句失败:

alter table tablename
add column b int after a,
drop column a 
  

错误代码:1054。“表名”中的未知列“ a”

如同在最终表中一样,将不再有列a,因此即使您仅在已经添加列a之后才删除b,它也是无效的。

根据您的情况,您需要进行更改

CHANGE COLUMN `CountryID` `CountryID` ... AFTER `FactoryID`,

CHANGE COLUMN `CountryID` `CountryID` ... AFTER `@FactoryID`,

为了期望您(以后)将列FactoryID重命名为@FactoryID

要使其完整,请执行以下操作:在after中,您不能引用稍后将add的列。例如,在语句末尾,您实际上添加了另一列FactoryID,但您仍不能在此处引用它(否则,查询不会失败)。不过,您可以先添加该列(甚至在重命名原始FactoryId之前,MySQL允许您以这种方式交换列名)。 CHANGE COLUMN CountryID CountryID ... AFTER FactoryID将可以工作,但是将引用 new 列(因此,总的来说,CountryID将是第二列,可能不是您想要的列)。

我不知道它是否在某处得到正式记录,您可能不得不将其作为惯例,但这种方式“一直”存在。