当且仅当表中不存在相同的列时,如何在SQLite表中添加列?
使用ALTER TABLE
我可以创建新列,但想知道如何检查表中是否已存在该列?
答案 0 :(得分:7)
如果表中不包含该列,SQLite会返回类似“no such column:foo”的错误:
select foo from yourTable limit 1
您还可以获取create-table语句:
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子字符串匹配发生在列名称上。
答案 1 :(得分:5)
在单个SQLite查询中无法(我知道)完成所有操作。您必须使用应用程序代码来管理If / Elseness。
检查表格是否存在:
select count(*) from sqlite_master where type = 'table' and name = MyTable';
检查表格中是否存在列或现在
pragma table_info(thumbnail);
但是,更好的方法可能是基于应用程序维护的架构版本的显式数据库架构更新(例如,从架构版本1到2的特定alter table语句):
pragma user_version;
答案 2 :(得分:0)
您可以使用'.schema tableName'
查看表格列答案 3 :(得分:0)
似乎无法检查列是否不存在,并在一个命令中添加新列,因为Sqlite不支持" 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;");
}