sqlite alter table




ALTER TABLE添加列,如果不是SQLite中的EXISTS (4)

我們最近需要在一些現有的SQLite數據庫表中添加列。 這可以使用ALTER TABLE ADD COLUMN 。 當然,如果表已被更改,我們希望不管它。 不幸的是,SQLite不支持ALTER TABLE上的IF NOT EXISTS子句。

我們當前的解決方法是執行ALTER TABLE語句並忽略任何“重複列名”錯誤,就像這個Python示例 (但在C ++中)。

但是,我們設置數據庫模式的常用方法是使用包含CREATE TABLE IF NOT EXISTSCREATE INDEX IF NOT EXISTS語句的.sql腳本,這些語句可以使用sqlite3_execsqlite3命令行工具執行。 我們不能在這些腳本文件中放置ALTER TABLE ,因為如果該語句失敗,則不會執行任何後續操作。

我希望將表定義放在一個地方,而不是在.sql和.cpp文件之間拆分。 有沒有辦法在純SQLite SQL中將變通方法編寫為ALTER TABLE ADD COLUMN IF NOT EXISTS


SQLite還支持名為“table_info”的pragma語句,該語句在表中每列返回一行,其中包含列的名稱(以及有關該列的其他信息)。 您可以在查詢中使用它來檢查缺少的列,如果不存在則更改表。

PRAGMA table_info(foo_table_name)

http://www.sqlite.org/pragma.html#pragma_table_info


threre是一種PRAGMA的方法是table_info(table_name),它返回表的所有信息。

這裡是如何使用它來檢查列是否存在,

public boolean isColumnExists (String table, String column) {
        Cursor cursor = db.rawQuery("PRAGMA table_info("+ table +")", null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                if (column.equalsIgnoreCase(name)) {
                    return true;
                }
            }
        }

        return false;
    }


如果您在數據庫升級語句中執行此操作,則最簡單的方法是在嘗試添加可能已存在的字段時捕獲引發的異常。

try {
   db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN foo TEXT default null");
} catch (SQLiteException ex) {
   Log.w(TAG, "Altering " + TABLE_NAME + ": " + ex.getMessage());
}




alter-table