2012-03-19 156 views
2

我在SQLite中创建表而不检查它是否存在。检查CREATE TABLE是否实际创建表或它是否已经存在?

sqlite3_stmt* create_stmt = NULL; 
if (sqlite3_prepare_v2(db, "CREATE TABLE mytable (sif INTEGER PRIMARY KEY, name VARCHAR, description VARCHAR);", -1, &create_stmt, NULL) == SQLITE_OK) 
{ 
    sqlite3_step(create_stmt); 
    sqlite3_finalize(create_stmt); 
} 

如果该表不存在,它将被创建;如果存在,没有任何反应。

我想知道是否有某种方式获取信息是否创建表或只是检查?

回答

2

有一个相当于MySQL的describe table在sqlite3的:.schema TABLENAME。有关更多信息,请参阅this question

因此,您可以发出.schema mytable以了解它是否已创建以及它的外观。为了更专注于一个单一的表,可以also use这一说法:

select count(type) from sqlite_master where type='table' and name='TABLE_NAME_TO_CHECK'; 
+0

好的,那是检查表是否存在但问题不同的方法。根据他们所做的事情从sqlite语句中获取返回的值。最有可能这是不可能的(在示例中)。 – 2012-03-19 08:44:50

+0

@ user973238如果你想关注你的数据库,你可以使用一个你想要遵循的动作的专用日志表,并将它与一些触发器相关联。 – Coren 2012-03-19 10:10:43

+0

嗯,对于现在这样的动作,我仍然是'短',仍然是初学者。无论如何,感谢您的帮助,“选择计数(类型)”非常出色! – 2012-03-19 12:08:34

1

如果我记得正确,如果您的表已经存在,它将sqlite3_step()失败,而不是sqlite3_prepare_v2。检查结果也是如此。
编辑:除此之外,您还应该检查反正这一切的时候,赶上损坏的数据库或其它错误情况;)

+0

我的sqlite3_step()永远不会失败。无论表格是否存在,它都会返回101。 – 2012-03-19 08:41:41

+1

101是'SQLITE_DONE';请参阅[结果代码](http://www.sqlite.org/c3ref/c_abort.html)。根据'sqlite3_step'文档,“使用”v2“接口时,可能会返回任何其他结果代码或扩展结果代码。请参阅[评估SQL语句](http://www.sqlite.org/c3ref/step.html)。 – jww 2014-01-20 22:46:26

3

我不知道,如果你还在寻找一个答案,但如果表则已经存在sqlite3_finalize返回非零(不SQLITE_OK)值。