sqlite判斷資料表存在用到的sql語句
select count(*) as cnt fromsqlite_masterwhere type='table' and name='dbinfo' //其中dbinfo為需要判斷的表名。注意大小寫敏感!
[目錄]sql-command
::=create[temp|temporary]table[if not exists]table-name
(
column-def
[,
column-def
]*
[,
constraint
]*
)
sql-command
::=create[temp|temporary]table[database-name
.
]table-name
asselect-statement
column-def
::=name
[type
][[constraintname
]column-constraint
]*type
::=typename
|
typename
(
number
)
|
typename
(
number
,
number
)
column-constraint
::=not null[conflict-clause
]|
primary key[sort-order
][conflict-clause
][autoincrement]|
unique[conflict-clause
]|
check (
expr
)
|
defaultvalue
|
collatecollation-name
constraint
::=primary key (
column-list
)
[conflict-clause
]|
unique (
column-list
)
[conflict-clause
]|
check (
expr
)
conflict-clause
::=on conflictconflict-algorithm
create table語句基本上就是"create table"關鍵字後跟乙個新的表名以及括號內的一堆 定義和約束。 表名可以是字串或者識別符號。以"sqlite_"開頭的表名是留給資料庫引擎使用的。
每個欄位的定義是欄位名後跟字段的資料型別,接著是乙個或多個的字段約束。欄位的 資料型別並不限制 欄位中可以存放的資料。可以檢視sqlite3的資料型別
獲取 更多資訊。 unique約束為指定的字段建立索引,該索引須含有唯一鍵。collate子句說明在比較欄位的 文字記錄時所使用的排序函式
。預設使用內嵌的binary排序函式。
default約束說明在使用insert插入欄位時所使用的預設值。 該值可以是null,字串常量或乙個數。從3.1.0版開始,預設值也可以是以下特殊的與事件無關的關鍵字current_time, current_date或current_timestamp.若預設值為null,字串常量或數,在執行未指明字段值的insert語句的時候它被 插入字段。 若預設值是current_time, current_date或current_timestamp,則當前utc日期和/或時間被插入字段。current_time的 格式為hh:mm:ss,current_date為yyyy-mm-dd,而current_timestamp是"yyyy-mm-dd hh:mm:ss".
正常情況下定義primary key只是在相應欄位上建立乙個unique索引。然而,若主鍵定義在單一的integer型別的字段上, 則該字段在內部被用作表的b-tree鍵。這即是說字段僅能容納唯一整數值。(在除此之外的其它情況下,sqlite忽略資料型別的說明 ,允許任何型別的資料放入欄位中,不管該字段被宣告為什麼資料型別。) 若乙個表中不含乙個integer primary key欄位,則b-tree鍵 為自動產生的整數。一行的b-tree鍵可以通過如下特殊的名字"rowid", "oid", 或 "_rowid_" 進行訪問,不論是否有integer primary key存在。integer primary key欄位可以使用關鍵字autoincrement宣告。autoincrement關鍵字修改了b-tree鍵自動產生的方式。b-tree鍵的生成 的其它資訊可以在這裡 找到。
若"temp"或"temporary"關鍵字出現在"create"和"table"之間,則所建立的表僅在當前資料庫連線可見,並在斷開連線時自動被刪除。在臨時表上建立的任何索引也是臨時的。臨時表和索引單獨儲存在與主資料庫檔案不同的檔案中。
若說明了,則表在該資料庫中被建立。同時宣告和temp關鍵字會出錯,除非 是"temp".若不宣告資料庫名,也不使用temp關鍵字,則表建立於主資料庫中。
在每個約束後跟可選的on conflict子句可以定義替代的約束衝突判定演算法。 預設為abort。同乙個表中的不同約束可以使用不同的預設衝突判定演算法。若一條copy, insert, 或 update 命令指定了不同的衝突判定演算法,則該演算法將替代create table語句中說明的預設演算法。 更多資訊,參見on conflict
.3.3.0版支援check約束。在3.3.0之前,check約束被解析但不執行。
表中的字段數或約束數沒有任何限制。在2.8版中,單行資料的總數被限制為小於1 megabytes。而在3.0中則消除了限制。
create table as形式定義表為乙個查詢的結果集。表的欄位名字即是結果中的欄位名字。
每條create table語句的文字都儲存在sqlite_master表中。每當資料庫被開啟,所有的create table語句從sqlite_master表中讀出,構成表結構的sqlite內部實現。若原始命令為create table as則合成出等效的 create table語句並儲存於sqlite_master表中代替原命令。create temporary table語句文字儲存於sqlite_temp_master表中。
若在命令中使用可選的if not exists子句且存在同名的另乙個表,則當前的命令無效。
刪除表可以使用drop table
語句。
SQL判斷資料表是否存在
最近重新做開發,又自己動手寫了sql語句,所以把一些東西記錄到這裡,為了加深印象,大家一起交流。假設有一張表,名為 personale if exists select from sysobjects where object id n personale and objectproperty id...
Sqlite 判斷表是否存在
最近的專案有在vc環境下使用sqlite,常常在建立表之前需要知道這個表是否存在。一開始用create table if not exists 這條sql語句,但是會報出錯誤提示 sqlite misuse 這種方法行不通,只好自己寫個函式判斷表是否存在。思路是寫乙個查詢語句,接著判斷列的個數,如果...
ADO方式下判斷資料表是否存在
檢視 大字型 中字型 小字型 前段時間做乙個管理系統的時候,乙個朋友問我不用資料庫,用excel可以做不,當時在做的過程中出了一一些的問題,就想現在說到的這樣,我在判斷資料是否存在的時候有一些問題,現在在網上找了點資料,整理後貼在這裡.下面構造兩個可過載的函式,用於在ado方式下判斷資料庫的資料表是...