Измените имя столбца в sqlite, когда другие таблицы имеют внешние ключи к нему
У меня есть таблица с именем groups, и я хочу переименовать один из ее столбцов. Пока все в порядке. Я знаю, что sqlite не поддерживает переименование столбцов, поэтому я сделал:
ALTER TABLE groups RENAME to tmp_groups;
CREATE TABLE groups(
_ID integer primary key autoincrement,
new_column_name integer
);
INSERT INTO groups(_ID, new_column_name) SELECT _ID, old_column_name FROM tmp_groups;
DROP TABLE tmp_groups;
Но когда я отбрасываю таблицу tmp_groups, члены таблицы, у которых был внешний ключ с ON DELETE CASCADE
его записи также были удалены, поэтому мне пришлось сделать следующее:
- Создайте таблицу tmp_members с теми же столбцами, что и у членов, и без внешнего ключа;
- Вставьте записи от участников в tmp_members;
- Бросить членов стола;
- Запустите код из первой части (с таблицей групп);
- Создайте заново членов таблицы с помощью внешнего ключа;
- Вставить в члены данные из tmp_members;
Чувак, это было утомительно! Слишком много кода, чтобы просто переименовать столбец;
Есть ли более простой способ справиться с этой проблемой ограничения, или это "sqlite way"?
1 ответ
По историческим причинам SQLite позволяет отключить ограничения внешнего ключа (и это даже по умолчанию в настоящее время).
Просто запустите PRAGMA foreign_keys = off перед выполнением groups
настольные вещи.
Также было бы возможно переименовать столбец с помощью PRAGMA writable_schema, но вы должны делать это, только если вы знаете, что делаете.