ALTER TABLE添加列如果不在SQLite中存在
最近我们需要将列添加到一些现有的SQLite数据库表中。 这可以通过ALTER TABLE ADD COLUMN
。 当然,如果桌子已经被改变了,我们想要放弃它。 不幸的是,SQLite不支持ALTER TABLE
上的IF NOT EXISTS
子句。
我们当前的解决方法是执行ALTER TABLE语句并忽略任何“重复的列名”错误,就像这个Python示例(但在C ++中)。
但是,我们常用的设置数据库模式的方法是使用包含CREATE TABLE IF NOT EXISTS
和CREATE INDEX IF NOT EXISTS
语句的.sql脚本,该脚本可以使用sqlite3_exec
或sqlite3
命令行工具执行。 我们不能在这些脚本文件中放置ALTER TABLE
,因为如果该语句失败,它后面的任何内容都不会被执行。
我希望将表定义放在一个地方,而不是在.sql和.cpp文件之间进行拆分。 有没有办法在纯SQLite SQL中编写一个解决方法到ALTER TABLE ADD COLUMN IF NOT EXISTS
?
我有一个99%纯SQL方法。 这个想法是为你的模式版本。 你可以通过两种方式来做到这一点:
使用'user_version'pragma命令( PRAGMA user_version
)为您的数据库模式版本存储增量编号。
将您的版本号存储在您自己定义的表格中。
这样,当软件启动时,它可以检查数据库模式,并在需要时运行ALTER TABLE
查询,然后增加存储的版本。 这远比尝试各种更新“盲目”要好得多,特别是如果您的数据库在过去几年中增长并发生了几次变化。
一种解决方法是只创建列并捕获列已经存在的异常/错误。 添加多列时,将它们添加到单独的ALTER TABLE语句中,以便一个副本不会阻止创建其他列。
用sqlite-net,我们做了这样的事情。 这并不完美,因为我们无法区分重复的sqlite错误和其他sqlite错误。
Dictionary<string, string> columnNameToAddColumnSql = new Dictionary<string, string>
{
{
"Column1",
"ALTER TABLE MyTable ADD COLUMN Column1 INTEGER"
},
{
"Column2",
"ALTER TABLE MyTable ADD COLUMN Column2 TEXT"
}
};
foreach (var pair in columnNameToAddColumnSql)
{
string columnName = pair.Key;
string sql = pair.Value;
try
{
this.DB.ExecuteNonQuery(sql);
}
catch (System.Data.SQLite.SQLiteException e)
{
_log.Warn(e, string.Format("Failed to create column [{0}]. Most likely it already exists, which is fine.", columnName));
}
}
SQLite还支持名为“table_info”的pragma语句,该语句在具有该列名称(以及有关该列的其他信息)的表格中为每列返回一行。 你可以在查询中使用它来检查缺失的列,如果不存在,请修改表。
PRAGMA table_info(foo_table_name)
http://www.sqlite.org/pragma.html#pragma_table_info
链接地址: http://www.djcxy.com/p/19801.html上一篇: ALTER TABLE ADD COLUMN IF NOT EXISTS in SQLite
下一篇: check whether the data is already exist in table, or to check table is empty