我需要检查列是否存在,如果不存在则添加它。根据我的研究,看起来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”附近:语法错误。
有什么想法吗?
答案 0 :(得分:48)
您无法使用ALTER TABLE with
案例.
您正在寻找获取表:: -
的列名PRAGMA table_info(table-name);
上查看本教程
此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)
-Dsetup
答案 15 :(得分:0)
SELECT EXISTS (SELECT * FROM sqlite_master WHERE tbl_name = 'TableName' AND sql LIKE '%ColumnName%');
..请注意,LIKE条件是不完美的,但是它对我有用,因为我所有的列都具有非常独特的名称。