mysql alter table给出未知列错误

uoifb46i  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(744)

我正在重命名我的许多表中的一组列,并更改它们的数据类型以进行主要的系统更新,除了这个问题之外,我没有遇到过很多问题。
错误代码:1054。“factories”中的未知列“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 是引用的,但不存在。

vof42yt1

vof42yt11#

该列的名称 after reference应该是最终表中列的新名称。不管你在陈述中的什么地方改名字。
事实上,它甚至使下面的陈述失败了:

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

错误代码:1054。“tablename”中的未知列“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 然后会工作,但会引用新的列(所以总的来说, CountryID 可能是第二栏,也可能不是你想要的)。
我不知道是否有官方文件记载,你可能会把它当作惯例,但它“一直”是这样的。

相关问题