如何在SQLite表中添加一个列,仅当同一列不存在于表中时?
使用ALTER TABLE
,我可以创建一个新的列,但想知道如何检查该列是否已经存在于表中?
如何在SQLite表中添加一个列,仅当同一列不存在于表中时?
使用ALTER TABLE
,我可以创建一个新的列,但想知道如何检查该列是否已经存在于表中?
如果表中不包含该列,SQLite会返回类似于“no such column: foo”的错误:
select foo from yourTable limit 1
select sql from sqlite_master where tbl_name = 'YourTableName'
然后解析结果,查找列名。我不知道有没有一种优雅的方法来查询指定表的列列表,尽管可能存在这样的方法。
此外,如果您尝试执行以下操作:
alter table YourTable add column foo {column-def whatever it is}
如果列已经存在,SQLite 会返回错误。您也可以捕获该错误。
最后,您可以这样做:
select sql from sqlite_master
where tbl_name = 'YOURTABLE' and sql like '%"foo" CHAR%'; -- or whatever type
如果查询的表格中包含了你在双引号中指定的列名和数据类型,那么你将会得到一个结果,否则将返回一个空集合。指定数据类型可以确保你使用 LIKE 子串匹配时作用于列名。
据我所知,没有一种方法可以在单个SQLite查询中完成所有操作。您必须使用应用程序代码来管理If / Elseness。
检查表是否存在:
select count(*) from sqlite_master where type = 'table' and name = MyTable';
检查表中是否存在某列
pragma table_info(thumbnail);
然而,更好的方法可能是基于应用程序维护的模式版本的显式数据库模式更新(例如,特定的alter table语句从模式版本1转到2):
pragma user_version;
看起来在一个命令中无法检查列是否存在并添加新列,因为Sqlite不支持列的"IF NOT EXISTS"。 "IF NOT EXISTS"只适用于表。
以下是我将要做的:
rev = ExecuteStatement("SELECT columnNamexx FROM tableNamexx limit 1;");
if(rev != SQLITE_OK){ // add col to table
ExecuteStatement("ALTER TABLE tableNamexx ADD COLUMN columnNamexx INTEGER DEFAULT 0;");
}