ALTER TABLE添加列如果不在SQLite中存在

最近我们需要将列添加到一些现有的SQLite数据库表中。 这可以通过ALTER TABLE ADD COLUMN 。 当然,如果桌子已经被改变了,我们想要放弃它。 不幸的是,SQLite不支持ALTER TABLE上的IF NOT EXISTS子句。

我们当前的解决方法是执行ALTER TABLE语句并忽略任何“重复的列名”错误,就像这个Python示例(但在C ++中)。

但是,我们常用的设置数据库模式的方法是使用包含CREATE TABLE IF NOT EXISTSCREATE INDEX IF NOT EXISTS语句的.sql脚本,该脚本可以使用sqlite3_execsqlite3命令行工具执行。 我们不能在这些脚本文件中放置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