migrations
migrations copied to clipboard
Renaming sqlite table with unique index throws "index already exists"
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
- Create sqlite table
- Create unique index on any column of this table
- 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.
Workaround that works: to rename table use 3 migrations instead of one:
- migration that drops indexes
- migration that renames table
- migration that restores (re-creates) indexes