migrations icon indicating copy to clipboard operation
migrations copied to clipboard

Renaming sqlite table with unique index throws "index already exists"

Open karrakoliko opened this issue 2 years ago • 1 comments

Bug Report

Q A
BC Break no
Version 3.6.0.0

Summary

When i try rename sqlite table that contains index, i get exception "index *** already exists".

Current behavior

An exception occurred while executing a query: SQLSTATE[HY000]: General error: 1 index *your_index_name* already exists

How to reproduce

  1. Create sqlite table
  2. Create unique index on any column of this table
  3. Create migration that renames table:
 $schema->renameTable('oldTableName', 'newTableName');

Demo repo: https://github.com/karrakoliko/doctrine-migrations-sqlite-driver-is-broken-example

Expected behavior

Table renamed (recreated with all the indexes, keys, etc., in case of sqlite)

Workaround tried (no success)

I tried workaround, but no success: Drop index in preUp hook, then recreate it in postUp hook. I ensured both hooks executed. Index successfully dropped, but not created (silently: no error appeared). $table->hasIndex(indexName) returns true, but index never created.

karrakoliko avatar Jul 25 '23 12:07 karrakoliko

Workaround that works: to rename table use 3 migrations instead of one:

  1. migration that drops indexes
  2. migration that renames table
  3. migration that restores (re-creates) indexes

karrakoliko avatar Jul 26 '23 11:07 karrakoliko