2012-03-19 158 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)值。

相關問題