Прежде чем я запустил rake db: migrate в приложении на Rails 4, я подтвердил, что есть два индекса, которые я хочу удалить в операторе SHOW CREATE TABLE:
MariaDB [my_db]> SHOW CREATE TABLE document_events\G;
*************************** 1. row ***************************
Table: document_events
Create Table: CREATE TABLE `document_events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`document_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`document_type` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_document_events_on_event_id` (`event_id`),
KEY `index_document_events_on_document_id` (`document_id`),
KEY `index_document_events_on_document_type` (`document_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)
Обратите внимание, что есть два конкретных индекса, которые представляют собой KEY-индексы, называемые index_document_events_on_document_id и index_document_events_on_document_type.Поэтому я создал миграцию, чтобы удалить их среди прочего:
def change
change_table :document_events do |t|
t.remove :document_type
t.remove :document_id
t.remove_index :document_type
t.remove_index :document_id
t.column :line_item_id, :string
t.index :line_item_id
end
end
Тем не менее, когда я запускаю rake db: migrate, я получаю следующую ошибку:
== 20190202215319 ChangeTableDocumentEvents: migrating ========================
-- change_table(:document_events)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
Index name 'index_document_events_on_document_type' on table 'document_events' does not exist
Затем я запускаю SHOWСнова создайте оператор CREATE TABLE, и индексы исчезнут!
MariaDB [my_db]> SHOW CREATE TABLE document_events\G;
*************************** 1. row ***************************
Table: document_events
Create Table: CREATE TABLE `document_events` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `index_document_events_on_event_id` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)
Почему это вызывает исключение, все же удаляя индексы в любом случае?Это приводит к тому, что миграция прерывается после их удаления.
Будет ли это единственным решением:
def change
change_table :document_events do |t|
t.remove :document_type
t.remove :document_id
t.column :line_item_id, :string
t.index :line_item_id
end
remove_index :document_events, :document_type
remove_index :document_events, :document_id
end