我试图改变列并同时更改表上的一些索引。要做到这一点,我使用pt-online-schema-change
以便它可以在线发生,但我收到了错误:
更改新表`db` ._test_table_new`时出错:DBD :: mysql :: db do failed:键列' foo'表格中没有[for Statement" ALTER TABLE`db` ._test_table_new`ADD INDEX test_table_composite_idx(foo,bar),DROP INDEX test_table_foo_idx,DROP_INDEX test_table_bar_idx,CHANGE COLUMN foo foo2 VARCHAR(127)NOT NULL ;"] / usr / bin / pt-online-schema-change line 9040。
该表创建如下:
CREATE TABLE `test_table` (
`id` bigint(20) unsigned NOT NULL,
`foo` varchar(127) DEFAULT NULL,
`bar` varchar(32) CHARACTER SET ascii DEFAULT NULL,
KEY `test_table_id_idx` (`id`),
KEY `test_table_foo_idx` (`foo`, `id`),
KEY `test_table_bar_idx` (`bar`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
从本质上讲,我尝试以下方法:
ADD INDEX test_table_composite_idx (foo, bar)
DROP INDEX test_table_foo_idx,
DROP INDEX test_table_bar_idx,
CHANGE COLUMN foo foo2 TEXT;
我能够单独进行索引更改和列更改(但是我需要将所有数据复制两次,更喜欢只复制一次),但是如果我将两者一起添加,它会给出一个错误。感觉我错过了一些明显的东西;任何想法?
答案 0 :(得分:1)
我发现您正在尝试在列的名称设置为在同一查询中修改的列上应用新索引。所以替换这个:
IRegionManager
用这个:
ADD INDEX test_table_composite_idx (foo, bar)
现在,关于尝试单独的步骤:首先更改列名称,然后应用ADD INDEX test_table_composite_idx (foo2, bar)
。你收到什么?错误。
现在,颠倒这些步骤。发生了什么?正如你已经说过的那样,它有效。
祝你好运。答案 1 :(得分:0)
试:::
ALTER TABLE test_table
DROP INDEX test_table_foo_idx
DROP INDEX test_table_bar_idx
CHANGE COLUMN foo foo2 VARCHAR(127)
MODIFY COLUMN foo2 TEXT
ADD INDEX test_table_composite_idx (foo2, bar)