检查SQLite中是否存在列

时间:2013-09-20 15:09:39

标签: sqlite

我需要检查列是否存在,如果不存在则添加它。根据我的研究,看起来sqlite不支持IF语句,而应该使用case语句。

这是我到目前为止所做的:

SELECT CASE WHEN exists(select * from qaqc.columns where Name = "arg" and Object_ID = Object_ID("QAQC_Tasks")) = 0 THEN ALTER TABLE QAQC_Tasks ADD arg INT DEFAULT(0);

但我收到错误:“ALTER”附近:语法错误。

有什么想法吗?

16 个答案:

答案 0 :(得分:48)

您无法使用ALTER TABLE with案例.

您正在寻找获取表:: -

的列名
PRAGMA table_info(table-name);

PRAGMA

上查看本教程
  

此pragma为指定表中的每列返回一行。   结果集中的列包括列名,数据类型,是否   或者不是列可以为NULL,以及列的默认值。   对于不是的列,结果集中的“pk”列为零   主键的一部分,是主键中列的索引   作为主键一部分的列的键。

答案 1 :(得分:15)

// This method will check if column exists in your table
public boolean isFieldExist(String tableName, String fieldName)
{
     boolean isExist = false;
     SQLiteDatabase db = this.getWritableDatabase();
     Cursor res = db.rawQuery("PRAGMA table_info("+tableName+")",null);
    res.moveToFirst();
    do {
        String currentColumn = res.getString(1);
        if (currentColumn.equals(fieldName)) {
            isExist = true;
        }
    } while (res.moveToNext());
     return isExist;
}

答案 2 :(得分:11)

虽然这是一个老问题,我在PRAGMA functions找到了一个更简单的解决方案:

SELECT COUNT(*) AS CNTREC FROM pragma_table_info('tablename') WHERE name='column_name'

如果结果大于零,则列存在。简单和一行查询

诀窍是使用

pragma_table_info('tablename')

而不是

PRAGMA table_info(tablename)

修改:请注意,正如PRAGMA functions中所述:

  

此功能具有实验性,可能会有所变化。如果PRAGMA功能的表值函数得到官方支持,将提供进一步的文档。

     

在SQLite 3.16.0版(2017-01-02)中添加了PRAGMA功能的表值函数。 SQLite的早期版本无法使用此功能。

答案 3 :(得分:6)

我已应用此解决方案:

public boolean isFieldExist(SQLiteDatabase db, String tableName, String fieldName)
    {
        boolean isExist = false;

        Cursor res = null;

        try {

            res = db.rawQuery("Select * from "+ tableName +" limit 1", null);

            int colIndex = res.getColumnIndex(fieldName);
            if (colIndex!=-1){
                isExist = true;
            }

        } catch (Exception e) {
        } finally {
            try { if (res !=null){ res.close(); } } catch (Exception e1) {}
        }

        return isExist;
    }

这是Pankaj Jangid的代码变体。

答案 4 :(得分:4)

检查现有列的奇怪方法

public static bool SqliteColumnExists(this SQLiteCommand cmd, string table, string column)
{
    lock (cmd.Connection)
    {
        // make sure table exists
        cmd.CommandText = string.Format("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = '{0}'", table);
        var reader = cmd.ExecuteReader();

        if (reader.Read())
        {
            //does column exists?
            bool hascol = reader.GetString(0).Contains(String.Format("\"{0}\"", column));
            reader.Close();
            return hascol;
        }
        reader.Close();
        return false;
    }
}

答案 5 :(得分:3)

获取表的列名:

PRAGMA table_info (tableName);

获取索引列:

PRAGMA index_info (indexName);

答案 6 :(得分:3)

您没有指定语言,因此假设它不是纯sql,您可以检查列查询时的错误:

SELECT col FROM table;

如果您收到错误,因此您知道该列不存在(假设您知道该表存在,无论如何您都有“IF NOT EXISTS”),否则该列存在,然后您可以相应地更改该表。

答案 7 :(得分:3)

更新DATABASE_VERSION,以便调用onUpgrade函数,如果Column已经存在,那么没有任何事情发生,如果没有,那么它将添加新列。

 private static class OpenHelper extends SQLiteOpenHelper {

OpenHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {


    if (!isColumnExists(db, "YourTableName", "YourColumnName")) {

        try {

            String sql = "ALTER TABLE " + "YourTableName" + " ADD COLUMN " + "YourColumnName" + "TEXT";
            db.execSQL(sql);

        } catch (Exception localException) {
            db.close();
        }

    }


}

}

 public static boolean isColumnExists(SQLiteDatabase sqliteDatabase,
                                     String tableName,
                                     String columnToFind) {
    Cursor cursor = null;

    try {
        cursor = sqliteDatabase.rawQuery(
                "PRAGMA table_info(" + tableName + ")",
                null
        );

        int nameColumnIndex = cursor.getColumnIndexOrThrow("name");

        while (cursor.moveToNext()) {
            String name = cursor.getString(nameColumnIndex);

            if (name.equals(columnToFind)) {
                return true;
            }
        }

        return false;
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

答案 8 :(得分:1)

  public static bool columExsist(string table, string column)
    {
        string dbPath = Path.Combine(Util.ApplicationDirectory, "LocalStorage.db");

        connection = new SqliteConnection("Data Source=" + dbPath);
        connection.Open();

        DataTable ColsTable = connection.GetSchema("Columns");

        connection.Close();

        var data = ColsTable.Select(string.Format("COLUMN_NAME='{1}' AND TABLE_NAME='{0}1'", table, column));

        return data.Length == 1;
    }

答案 9 :(得分:1)

我更新了朋友的功能......现在已经过测试和工作

plot &depT1*(&indepT1);

答案 10 :(得分:1)

我很抱歉发布很晚。在意图中发布可能对某人的情况有所帮助。

我尝试从数据库中提取列。如果它返回一行,则它包含该列,否则不包含......

-(BOOL)columnExists { 
 BOOL columnExists = NO;

//Retrieve the values of database
const char *dbpath = [[self DatabasePath] UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK){

    NSString *querySQL = [NSString stringWithFormat:@"SELECT lol_10 FROM EmployeeInfo"];
    const char *query_stmt = [querySQL UTF8String];

    int rc = sqlite3_prepare_v2(database ,query_stmt , -1, &statement, NULL);
    if (rc  == SQLITE_OK){
        while (sqlite3_step(statement) == SQLITE_ROW){

            //Column exists
            columnExists = YES;
            break;

        }
        sqlite3_finalize(statement);

    }else{
        //Something went wrong.

    }
    sqlite3_close(database);
}

return columnExists; 
}

答案 11 :(得分:1)

其中一些例子对我不起作用。我正在尝试检查我的表是否已包含列。

我正在使用此代码段:

public boolean tableHasColumn(SQLiteDatabase db, String tableName, String columnName) {
    boolean isExist = false;
    Cursor cursor = db.rawQuery("PRAGMA table_info("+tableName+")",null);
    int cursorCount = cursor.getCount();
    for (int i = 1; i < cursorCount; i++ ) {
        cursor.moveToPosition(i);
        String storedSqlColumnName = cursor.getString(cursor.getColumnIndex("name"));
        if (columnName.equals(storedSqlColumnName)) {
            isExist = true;
        }
    }
    return isExist;
}

上面的示例是查询pragma表,它是元数据表而不是实际数据,每列指示表的列的名称,类型和其他一些内容。因此实际的列名称在行内。

希望这有助于其他人。

答案 12 :(得分:1)

尝试使用catch并最终将其用于任何rawQuery()执行,以获得更好的实践。以下代码将为您提供结果。

public boolean isColumnExist(String tableName, String columnName)
{
    boolean isExist = false;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = null;
    try {
        cursor = db.rawQuery("PRAGMA table_info(" + tableName + ")", null);
        if (cursor.moveToFirst()) {
            do {
                String currentColumn = cursor.getString(cursor.getColumnIndex("name"));
                if (currentColumn.equals(columnName)) {
                    isExist = true;
                }
            } while (cursor.moveToNext());

        }
    }catch (Exception ex)
    {
        Log.e(TAG, "isColumnExist: "+ex.getMessage(),ex );
    }
    finally {
        if (cursor != null)
            cursor.close();
        db.close();
    }
    return isExist;
}

答案 13 :(得分:0)

与SQLite中的IF类似,SQLite中的CASE表达式。您无法使用ALTER TABLE。请参阅:http://www.sqlite.org/lang_expr.html

答案 14 :(得分:0)

Pankaj Jangid的answer虽然接近但不太正确。这是纠正:

-Dsetup

答案 15 :(得分:0)

SELECT EXISTS (SELECT * FROM sqlite_master WHERE tbl_name = 'TableName' AND sql LIKE '%ColumnName%');

..请注意,LIKE条件是不完美的,但是它对我有用,因为我所有的列都具有非常独特的名称。