ДОБАВИТЬ КОЛОНКУ на sqlite db ЕСЛИ НЕ СУЩЕСТВУЕТ - flex/air sqlite?
У меня есть приложение flex/air, над которым я работал, он использует локальную базу данных sqlite, которая создается при запуске первого приложения.
Я добавил некоторые функции в приложение, и в процессе я должен был добавить новое поле в одну из таблиц базы данных. Мои вопросы: как мне заставить приложение создать одно новое поле, которое находится в таблице, которая уже существует?
это строка, которая создает таблицу
stmt.text = "CREATE TABLE IF NOT EXISTS tbl_status ("+"status_id INTEGER PRIMARY KEY AUTOINCREMENT,"+" status_status TEXT)";
И теперь я хотел бы добавить поле status_default.
спасибо!
Спасибо - MPelletier
Я добавил код, который вы предоставили, и он добавляет это поле, но теперь, в следующий раз, когда я перезапущу свое приложение, я получаю сообщение об ошибке - status_default уже существует.
Итак, как я могу добавить некоторую инструкцию IF NOT EXISTS в строку, которую вы предоставили?
Ответы
Ответ 1
ALTER TABLE tbl_status ADD COLUMN status_default TEXT;
http://www.sqlite.org/lang_altertable.html
При этом добавление столбцов в SQLite ограничено. Вы не можете добавить столбец нигде, но после последнего столбца в таблице.
Что касается проверки того, что столбец уже существует, PRAGMA table_info(tbl_status);
вернет таблицу, в которой перечислены различные столбцы вашей таблицы.
ДОБАВИТЬ ВКЛ:
Я использую стратегию в дизайне базы данных, которая позволяет мне различать, какие изменения необходимы. Для этого вам понадобится новая таблица (назовите ее DBInfo
), с одним полем (Integer, назовите ее SchemaVersion
). Кроме того, внутри SQLite называется внутреннее значение user_version
, которое может быть установлено с помощью команды PRAGMA
. Ваш код может при запуске программы проверять номер версии схемы и соответственно применять изменения, по одной версии за раз.
Предположим, что функция с именем UpdateDBSchema()
. Эта функция будет проверять вашу версию схемы базы данных, не обрабатывать DBInfo и определять, что база данных находится в версии 0. Остальная часть этой функции может быть просто большим коммутатором с разными версиями, вложенными в цикл (или доступную другую структуру к вашей платформе выбора).
Итак, для этой первой версии используйте функцию UpgradeDBVersion0To1()
, которая создаст эту новую таблицу (DBInfo
), добавит ваше поле status_default
и установит SchemaVersion
в 1. В вашем коде добавьте константу который указывает последнюю версию схемы, скажем LATEST_DB_VERSION
, и установите ее в 1. Таким образом, ваш код и ваша база данных имеют версию схемы, и вы знаете, что вам нужно синхронизировать их, если они не равны.
Когда вам нужно внести другое изменение в свою схему, установите константу LATEST_DB_VERSION
равным 2 и создайте новую функцию UpgradeDBVersion1To2()
, которая выполнит необходимые изменения.
Таким образом, ваша программа может быть легко перенесена, может подключаться и обновлять старую базу данных и т.д.
Ответ 2
Я знаю, что это старый вопрос... однако.
Я столкнулся с этой точной проблемой в реализации SQLite в Adobe AIR. Я думал, что можно будет использовать команду PRAGMA для разрешения, но поскольку реализация adobe air не поддерживает команду PRAGMA, нам нужна альтернатива.
Что я сделал, что, по-моему, стоило бы поделиться здесь, вот что:
var sql:SQLStatement = new SQLStatement();
sql.sqlConnection = pp_db.dbConn;
sql.text = "SELECT NewField FROM TheTable";
sql.addEventListener(SQLEvent.RESULT, function(evt:SQLEvent):void {
});
sql.addEventListener(SQLErrorEvent.ERROR, function(err:SQLErrorEvent):void {
var sql:SQLStatement = new SQLStatement();
sql.sqlConnection = pp_db.dbConn;
sql.text = "ALTER TABLE TheTable ADD COLUMN NewField NUMERIC;";
sql.execute();
sql.addEventListener(SQLEvent.RESULT, function (evt:SQLEvent):void {
});
});
sql.execute();
Надеюсь, что это поможет кому-то.
Ответ 3
Я решил аналогичную проблему, используя ответ на этот вопрос:
ALTER TABLE ADD COLUMN, ЕСЛИ НЕ СУЩЕСТВУЕТ В SQLite
Используйте встроенный параметр user_version, чтобы отслеживать ваши обновления. Вы устанавливаете его, используя:
PRAGMA user_version = 1
и вы получите его с помощью
PRAGMA user_version
Таким образом, в основном извлекайте user_version (по умолчанию 0), проверьте, равно ли оно 0. Если да, выполните ваши обновления и установите его в 1. Если в будущем у вас будет больше обновлений, проверьте, 1 ли это, выполните обновления и установите его до 0. И так далее...
Ответ 4
В некоторых случаях я выполняю команду и получаю исключение для "дублирующего столбца". Просто быстрое решение, а не идеальное.
Ответ 5
Добавление " IF NOT EXISTS
в мой запрос заставило его работать на меня.
Мой запрос SQL в моем файле .sql
был:
ALTER TABLE results ADD caseid INT UNSIGNED DEFAULT 0;
и добавление IF NOT EXISTS
заставило его работать:
ALTER TABLE results ADD caseid IF NOT EXISTS INT UNSIGNED DEFAULT 0;