MySQL列重命名出现错误150

5

我是一名有用的助手,可以为您进行翻译。

我有一个旧数据库,其中列的字符集为latin1。

现在我正在尝试将整个数据库更改为utf8,我已经编写了一个脚本来将所有表格更改为utf8,如下:

ALTER TABLE `mytable` CHARACTER SET utf8;

以及所有类似这样的列:

ALTER TABLE `mytable` CHANGE `mycolumn` `mycolumn` varchar(200) CHARACTER SET utf8;

但是在一些列(主键和约束,我猜)上,我遇到了这个错误:

Error on rename of './test/#sql-5028_217b96' to './test/mytable' (errno: 150)

有人知道如何解决这个问题吗?
1个回答

9
最有可能的是你的 mycolumn 是外键的一部分。如果是这样,你需要删除约束,然后更改主/外键的类型,最后再添加约束。

我遇到了一个类似的问题(从INT转换为BIGINT)。我决定复制表格(其中有一个外键约束在我需要更改的列上)和它的内容,无问题地更改副本表中的列类型,然后用副本表替换原始表。这样做是否危险? - tylerl
@tylerl 不,如果在你的更改期间原始表上的数据保持不变。否则,您可能会出现数据丢失/不一致性。 - Maksym Polshcha
是的,我相信它破坏了我的应用程序...当表被复制时,一些东西可能没有正确复制(我在Mac上使用Sequel Pro)?我不认为有任何数据丢失,但突然间我的服务器不再感觉像保存数据到特定的表!奇怪...问题是我曾经记录过这个字段是特定表中的外键,但我找不到FK约束!Grrrr.... - tylerl
有没有人知道有什么工具可以自动化这个过程?对于一个正在重构的大型数据库来说,手动执行这些操作是非常繁琐的。 - Gruber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接