MySQL alter table 给出未知列错误
MySQL alter table gives unknown column error
我正在重命名我的很多表中的一堆列并更改它们的数据类型以进行主要的系统更新,除了这个之外我没有遇到很多问题。
Error Code: 1054. Unknown column 'FactoryID' in 'factories'
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
都不存在。
after
引用的列名应该是最终table 中列的new 名称。在声明中的哪个位置更改名称并不重要。
实际上它甚至使下面的语句失败:
alter table tablename
add column b int after a,
drop column a
Error Code: 1054. Unknown column 'a' in 'tablename'
和最后的table一样,不会再有第a
列,所以即使你在已经添加第b
列之后再删除a
也是无效的].
在您的情况下,您需要更改
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
将是第二列,这可能是也可能不是你有意)。
我不知道它是否在某处有正式记录,您可能不得不将其视为惯例,但它 "always" 就是这样。
我正在重命名我的很多表中的一堆列并更改它们的数据类型以进行主要的系统更新,除了这个之外我没有遇到很多问题。
Error Code: 1054. Unknown column 'FactoryID' in 'factories'
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
都不存在。
after
引用的列名应该是最终table 中列的new 名称。在声明中的哪个位置更改名称并不重要。
实际上它甚至使下面的语句失败:
alter table tablename
add column b int after a,
drop column a
Error Code: 1054. Unknown column 'a' in 'tablename'
和最后的table一样,不会再有第a
列,所以即使你在已经添加第b
列之后再删除a
也是无效的].
在您的情况下,您需要更改
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
将是第二列,这可能是也可能不是你有意)。
我不知道它是否在某处有正式记录,您可能不得不将其视为惯例,但它 "always" 就是这样。