Вопрос или проблема
В таблице Case_Supplies_Media у меня есть столбец SupplyID_XRef. В настоящее время он имеет внешнюю ссылку на Media_List. Мне нужно изменить ссылку на Supplies_DVD_List. Я нашел некоторые фрагменты, но не уверен, как собрать все это вместе в коде. Я использую GRDB. Заранее спасибо за помощь.
func update_Foreign_Key()
{
let the_Version = ModelData.get_Current_Version()
if the_Version == 6
{
do {
try Database_GRDB.shared.databaseConnection!.write { db in
try db.execute(sql: "UPDATE Case_Supplies_Media SET SupplyID_XRef = :value", arguments: ["value": "Supplies_DVD_List"])
// ВНЕШНИЙ КЛЮЧ("SupplyID_XRef") ССЫЛАЕТСЯ Нa "Media_List"
// измените на это
// ВНЕШНИЙ КЛЮЧ("SupplyID_XRef") ССЫЛАЕТСЯ Нa "Supplies_DVD_List"
// Установите версию на 7
try db.execute(sql: "UPDATE My_Settings SET Version = :version WHERE SettingsID = :id", arguments: ["version": 7, "id": 1])
}
} catch {
print("Обновление значений Foreign_Key не удалось! (AppDelegate) \(error)")
}
}
}
.
Ответ или решение
Для изменения внешнего ключа в существующей таблице Case_Supplies_Media
с использованием GRDB, вам необходимо выполнить несколько шагов, включая удаление старого внешнего ключа и добавление нового. В GRDB есть ограничения на обновление внешних ключей, поэтому нам придется создать новую таблицу с нужными изменениями, скопировать данные из старой таблицы, а затем удалить старую таблицу.
Вот как это можно сделать:
- Создание временной таблицы — создаем новую таблицу с нужным внешним ключом.
- Копирование данных — переносим данные из старой таблицы в новую.
- Удаление старой таблицы — удаляем старую таблицу.
- Переименование новой таблицы — переименовываем новую таблицу в старое имя.
Вот пример кода, который иллюстрирует данный процесс:
func updateForeignKey() {
let currentVersion = ModelData.getCurrentVersion()
if currentVersion == 6 {
do {
try Database_GRDB.shared.databaseConnection!.write { db in
// Шаг 1: Создать временную таблицу с новыми внешними ключами
try db.execute(sql: """
CREATE TABLE Case_Supplies_Media_new (
id INTEGER PRIMARY KEY,
SupplyID_XRef INTEGER,
-- другие колонки, которые у вас есть
FOREIGN KEY (SupplyID_XRef) REFERENCES Supplies_DVD_List(id)
)
""")
// Шаг 2: Копируем данные из старой таблицы в новую
try db.execute(sql: """
INSERT INTO Case_Supplies_Media_new (id, SupplyID_XRef)
SELECT id, SupplyID_XRef
FROM Case_Supplies_Media
""")
// Шаг 3: Удаляем старую таблицу
try db.execute(sql: "DROP TABLE Case_Supplies_Media")
// Шаг 4: Переименовываем новую таблицу в старое имя
try db.execute(sql: "ALTER TABLE Case_Supplies_Media_new RENAME TO Case_Supplies_Media")
// Обновляем версию
try db.execute(sql: "UPDATE My_Settings SET Version = :version WHERE SettingsID = :id", arguments: ["version": 7, "id": 1])
}
} catch {
print("Ошибка при обновлении внешнего ключа! \(error)")
}
}
}
Объяснение кода:
- Создание временной таблицы: Мы создали новую таблицу
Case_Supplies_Media_new
, где внешний ключSupplyID_XRef
ссылается на новую таблицуSupplies_DVD_List
. - Копирование данных: Здесь мы переносим данные из старой таблицы в новую. Убедитесь, что вы копируете все необходимые столбцы.
- Удаление старой таблицы: Используем команду
DROP TABLE
для удаления старой таблицы. - Переименование новой таблицы: С помощью команды
ALTER TABLE
мы переименовываем временную таблицу в оригинальное имя. - Обновление версии настройки: В конце мы обновляем номер версии в таблице
My_Settings
.
Заключение
Этот процесс позволяет изменить внешний ключ в таблице, сохранив при этом данные. Не забывайте делать резервные копии ваших данных перед выполнением таких изменений. Это поможет избежать потери данных в случае ошибки. Также убедитесь, что у вас корректно настроены ограничения и индексы, которые могут понадобиться вашим данным.