Индекс существует в таблице, но Migrations говорит, что еще не удаляет его из базы данных - PullRequest
0 голосов
/ 03 февраля 2019

Прежде чем я запустил 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...