Измените имя столбца в 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 его записи также были удалены, поэтому мне пришлось сделать следующее:

  1. Создайте таблицу tmp_members с теми же столбцами, что и у членов, и без внешнего ключа;
  2. Вставьте записи от участников в tmp_members;
  3. Бросить членов стола;
  4. Запустите код из первой части (с таблицей групп);
  5. Создайте заново членов таблицы с помощью внешнего ключа;
  6. Вставить в члены данные из tmp_members;

Чувак, это было утомительно! Слишком много кода, чтобы просто переименовать столбец;

Есть ли более простой способ справиться с этой проблемой ограничения, или это "sqlite way"?

1 ответ

Решение

По историческим причинам SQLite позволяет отключить ограничения внешнего ключа (и это даже по умолчанию в настоящее время).

Просто запустите PRAGMA foreign_keys = off перед выполнением groups настольные вещи.


Также было бы возможно переименовать столбец с помощью PRAGMA writable_schema, но вы должны делать это, только если вы знаете, что делаете.

Другие вопросы по тегам