在sqlite中,如果表中不存在相同的列,如何添加列到表中?

7

如何在SQLite表中添加一个列,仅当同一列不存在于表中时?

使用ALTER TABLE,我可以创建一个新的列,但想知道如何检查该列是否已经存在于表中?


1
您可以使用'.schema tableName'查看表格列。 - krakover
1
@krakover 那不是一个答案吗? - Linus Kleen
根据他想要实现什么,@goreSplatter。我解释了如何避免这个问题,而不是如何解决它。 - krakover
@krakover 我看不出有什么需要避免的问题,只是一个如何确定列存在的问题。这可以通过您的评论来确定。但这可能是离题了。 - Linus Kleen
4个回答

8

如果表中不包含该列,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 子串匹配时作用于列名。


5

据我所知,没有一种方法可以在单个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;

1

看起来在一个命令中无法检查列是否存在并添加新列,因为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;");
}

0
您可以使用'.schema tableName'查看表格的列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接