1. 程式人生 > >SQLite3命令操作與使用總結

SQLite3命令操作與使用總結

SQLite庫包含一個名字叫做sqlite3的命令列,它可以讓使用者手工輸入並執行面向SQLite資料庫的SQL命令。本文件提供一個樣使用sqlite3簡要說明.

.qlite3一些常用Sql語句操作

建立表: create  table 表名(元素名 型別,…); 

刪除表: drop  table 表名;              

插入資料: insert into 表名 values(, , ,) ;   

建立索引: create [unique] index 索引名on 表名(col….);

刪除索引 drop index 索引名(索引是不可更改的,想更改必須刪除重新建)
刪除資料

: delete from 表名;              

更新資料: update 表名 set 欄位=’修改後的內容’ where 條件

增加一個列: Alter table 表名 add column 欄位 資料型別;  

選擇查詢:   select 欄位(”,”隔開) from 表名 where 條件

日期和時間Select datetime('now') 

日期:select date('now');        
時間:  select time('now');   

總數select count(*) from table1;求和select sum(field1) from table1

;平均select avg(field1) from table1;最大select max(field1) from table1;最小select min(field1) from table1;

排序select 欄位 from table1order by 欄位(descasc)  ;(降序或升序)

分組select 欄位 from table1group by 欄位,欄位  ;

限制輸出:select 欄位 fromtable1 limit offset y;

= select欄位fromtable1limit y , x;

(備註:跳過y行,取x行資料)

(操作仍待完善

)

SQLite支援哪些資料型別些?

NULL  值為NULL
INTEGER 值為帶符號的整型,根據類別用123468位元組儲存
REAL  值為浮點型,8位元組儲存
TEXT  值為text字串,使用資料庫編碼(UTF-8, UTF-16BE or UTF-16-LE)儲存
BLOB  值為二進位制資料,具體看實際輸入

但實際上,sqlite3也接受如下的資料型別:
smallint   16 位元的整數
interger   32 位元的整數
decimal(p,s)  p 精確值和 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值 ,s是指小數點後有幾位數。如果沒有特別指定,則系統會設為 p=5; s=0 
float    32位元的實數。
double    64位元的實數。
char(n)    n 長度的字串,n不能超過 254
varchar(n)   長度不固定且其最大長度為 的字串,n不能超過 4000
graphic(n)   和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是為了支援兩個字元長度的字型,例如中文字。
vargraphic(n)  可變長度且其最大長度為 的雙字元字串,n不能超過 2000
date    包含了 年份、月份、日期。
time    包含了 小時、分鐘、秒。
timestamp   包含了 年、月、日、時、分、秒、千分之一秒。

如果將宣告表的一列設定為 INTEGER PRIMARY KEY,則具有:

1.每當你在該列上插入一NULL值時, NULL自動被轉換為一個比該列中最大值大1的一個整數;

2.如果表是空的, 將會是1

算術函式

abs(X)返回給定數字表達式的絕對值。

max(X,Y[,...])返回表示式的最大值。

min(X,Y[,...])返回表示式的最小值。

random(*)返回隨機數。

round(X[,Y])返回數字表達式並四捨五入為指定的長度或精度。

字元處理函式

length(X)返回給定字串表示式的字元個數。

lower(X)將大寫字元資料轉換為小寫字元資料後返回字元表示式。

upper(X)返回將小寫字元資料轉換為大寫的字元表示式。

substr(X,Y,Z)返回表示式的一部分。

randstr()

quote(A)

like(A,B)

確定給定的字串是否與指定的模式匹配。

glob(A,B)

條件判斷函式

coalesce(X,Y[,...])

ifnull(X,Y)

nullif(X,Y)

集合函式

avg(X)返回組中值的平均值。

count(X)返回組中專案的數量。

max(X)返回組中值的最大值。

min(X)返回組中值的最小值。

sum(X)返回表示式中所有值的和。

其他函式

typeof(X)返回資料的型別。

last_insert_rowid()返回最後插入的資料的 ID 

sqlite_version(*)返回 SQLite 的版本。

change_count()返回受上一語句影響的行數。

last_statement_change_count()

.有關事務的操作

(成批操作的時候,啟動事務,比不啟動事務快n)

開始事物處理

BEGIN  TRANSACTION;

…………..

進行對資料庫操作

…………..

事物提交

COMMIT;

具體事例如下:

假設有一個 t1 表,其中有 "a", "b", "c" 三列, 如果要刪除列 ,以下過程描述如何做:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

.啟動sqlite3程式

僅僅需要敲入帶有SQLite資料庫名字的"sqlite3"命令即可。如果檔案不存在,則建立一個新的(資料庫)檔案。然後 sqlite3程式將提示你輸入SQL。敲入SQL語句(以分號“”結束),敲回車鍵之後,SQL語句就會執行。
    例如,建立一個包含一個表"tb11"名字為"ex1"SQLite資料庫,你可以這樣做:
資料庫、表的建立,記錄的新增、查詢、修改和刪除
F:\>sqlite3 database.db
sqlite> create table admin(username text,age integer);
sqlite> insert into admin values('kuang',25);
sqlite> select * from admin;
sqlite> update admin set username='kk',age=24 where username='kuang' and age=25;
sqlite> delete from admin where username='kk';
注:每條sql語句後必須以";"號結尾!
$sqlite3 ex1
SQLite version 3.3.17
Enter ".help" for instructions
sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello!', 10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>
        你可以通過敲你所用系統的檔案結束符(通常是Ctrl + D)或者中斷字元(通常是Ctrl + C)。來終止sqlite3程式。確定你在每個SQL語句結束敲入分號!sqlite3程式通過查詢分號來決定一個SQL語句的結束。如果你省略分 號,sqlite3將給你一個連續的命令提示符並等你給當前的SQL命令新增更多的文字。這個特點讓你輸入多行的多個SQL語句,例如:
sqlite> create table tbl2(
   ...> f1 varchar(30) primary key,
   ...> f2 text,
   ...> f3 real
   ...> );
sqlite>

.題外話:查詢SQLITE_MASTER

    SQLite資料庫的框架被儲存在一個名叫"sqlite_master"的特殊的表中。你可以像查詢其它表一樣通過執行“SELECT”查詢這個特殊的表。例如:
$ sqlite3 ex1
SQlite vresion 3.3.10
Enter ".help" for instructions
sqlite> select * from sqlite_master;
     type = table
     name = tbl1
tbl_name = tbl1
rootpage = 3
      sql = create table tbl1(one varchar(10), two smallint)
sqlite>
    但你不能在sqlite_master表中執行諸如DROP TABLE, UPDATEINSERT 或者DELETE命令。sqlite_master表在你建立、刪除和索引資料庫時自動更新這個表。你不能手工更改sqlite_master表。
    TEMPORARY表的結構沒有儲存在"sqlite_master"表中,由於TEMPORARY表對應用是不可見的,而不是應用程式建立這個表。 TEMPORARY表結構被儲存在另外一個名叫"sqlite_temp_master"的特定的表中。"sqlite_temp_master"表是臨 時表自身。

.sqlite3的特殊命令

   大多數候,sqlite3讀入輸入行,並把它們傳遞到SQLite庫中去執行。但是如果輸入行以一個點(“.”)開始,那麼這行將被sqlite3程式自 己擷取並解釋。這些“點命令”通常被用來改變查詢輸出的格式,或者執行鞭個預封包(預定義prepackaged)的查詢語句。
你可以在任何時候輸入“.help”,列出可用的點命令。例如
sqlite> .help

.bail ON|OFF            

Stop after hitting an error.  Default OFF(遇到錯誤時不再繼續預設為OFF)

.databases             

 List names and files of attached databases(列出附加到資料庫的資料庫和檔案)

.dump ?TABLE? ...       

Dump the database in an SQL text format(儲存表到SQL格式的檔案中沒有指表名則儲存所有如果要儲存到磁碟上需要結合 .output 命令.)

.echo ON|OFF              

Turn command echo on or off(開啟/關閉 命令列回顯)

.exit                      

Exit this program(退出該命令列)

.explain ON|OFF           

Turn output mode suitable for EXPLAIN on or off.( 以合適的方式顯示錶頭不帶引數則為開啟)

.header(s) ON|OFF        

Turn display of headers on or off(是否顯示錶頭和 .explain 差別不是很大)

.help                       

Show this message(顯示幫助資訊)

.import FILE TABLE         

Import data from FILE into TABLE(從檔案中匯入表)

.indices TABLE              

Show names of all indices on TABLE(顯示索引)

.load FILE ?ENTRY?         

Load an extension library(載入一個擴充套件庫)

.mode MODE ?TABLE?      

Set output mode where MODE is one of:

(設定輸出模式模式可以是以下幾種):
                          csv       Comma-separated values( 以逗號分隔的值)
                          column    Left-aligned columns.   (See .width)( 表頭左對齊(參見 .width))
                          html      HTML <table> code(顯示 HTML 程式碼)
                          insert    SQL insert statements for TABLE( SQL插入語句)
                          line      One value per line( 一行一個值)
                          list      Values delimited by separator string(值用 string 分隔)
                          tabs      Tab-separated values(以 tab 分隔的值)
                          tcl       TCL list elements(TCL 列表元素)

.nullvalue STRING       

Print STRING in place of NULL values(以 STRING 代替 NULL 值的輸出)

.output FILENAME        

Send output to FILENAME(輸出到檔案而不是顯示在螢幕上)

.output stdout          

Send output to the screen(輸出到螢幕上)

.prompt MAIN CONTINUE   

Replace the standard prompts(替換預設的命令提示資訊預設就是 sqlite>)

.quit                     

Exit this program(退出命令列)

.read FILENAME         

Execute SQL in FILENAME(執行 FILENAME 中的 SQL語句)

.schema ?TABLE?         

Show the CREATE statements(顯示 CREATE 語句)

.separator STRING       

Change separator used by output mode and .import

.show                    

Show the current values for various settings(顯示各種設定)

.tables ?PATTERN?       

List names of tables matching a LIKE pattern(檢視資料庫的表列表)

.timeout MS             

Try opening locked tables for MS milliseconds(在 MS 時間內嘗試開啟被鎖定的表)

.width NUM NUM ...      

Set column widths for "column" mode(設定 column 模式中的列的寬度)

.timer ON|OFF      

(顯示CPU時間)

.vfsname ?AUX?    

(顯示 VFS 棧資訊)

.restore ?DB? FILE  

(從檔案中還原資料到表,  預設表為 main)
sqlite>

.改變輸出格式(.mode)

    sqlite3程式可以以八種不同的格式顯示一個查詢的結果:"csv", "", "html", "插入", "", "製表""tcl"。你可以用".mode"點命令在這些輸出格式之間切換。
    預設的輸出格式是“列表”。在列表模式下,每條查詢結果記錄被寫在一行中並且每列之間以一個字串分割符隔開。預設的分隔符是一個管道符號(“|”)。列表符號在當你輸出查詢結果到另外一個符加處理的程式(如AWK)中去是尤為有用。
sqlite> .mode list
sqlite> select * from tbl1;
hello|10
goodbye|20
sqlite>
    你可以用“.separator”點命令來改變分界符。例如,為了把分割符改為一個逗號和一個空格,你可以這樣做:
sqlite> .separator ", "
sqlite> select * from tbl1;
hello, 10
goodbye, 20
sqlite>
    在“line"模式下,每一個位於條記錄中的列在它自己那行顯示。每行由列名、一個等號和列資料組成。下一條記錄以一個空行隔開。這是一個行模式輸出的例子:
sqlite> .mode line
sqlite> select * from tbl1;
one = hello
two = 10
one = goodbye
two = 20
sqlite>
    在列模式下,每條記錄在一個單獨的行中以資料列對齊的方式顯示。列如:
sqlite> .mode column
sqlite> select * from tbl1;
one          two       
----------   ----------
hello        10        
goodbye      20        
sqlite>
        在預設的情況下,每列至少10個字元寬。太寬(超過設定的寬度)的資料將被擷取。你可以用“.width命令來調整列寬。如下所示:
sqlite> .width 12 6            (第一列12,第二列6)
sqlite> select * from tbl1;
one            two   
------------   ------
hello          10    
goodbye        20    
sqlite>
     上面例子中".width"命令設定第一列寬為12第二列寬為6。其它的列寬不變。你可以指定與你查詢結果需要的列數一樣多的“.width”引數。
    如果你指定一列寬為0,那麼這個列寬將自動以下面三個數字中的最大值做為列寬:10、表頭寬度最寬的資料列寬度。這可以讓列自動調整寬度。每列的預設設定為自動調整的0值。
    出現在輸出開頭兩行的列標示可以用".header"點命令關閉。在上面的例子中,列標示是開啟的。可以用下面的方法關閉列標示
sqlite> .header off
sqlite> select * from tbl1;
hello          10    
goodbye        20    
sqlite>
    另外一個有用的輸出模式是"insert"。在插入模式下,被子格式化為看起來像SQL INSERT語句的樣式。你可以用插入模式來產生檔案(便於)以後用於不同資料庫的輸入。
    當指定插入模式時,你必須給定一個特定引數就是要插入的表名。例如:
sqlite> .mode insert new_table
sqlite> select * from tbl1;
INSERT INTO 'new_table' VALUES('hello',10);
INSERT INTO 'new_table' VALUES('goodbye',20);
sqlite>
    最新的輸出格式是“html”。在這種模式下,sqlite3把查詢的結果寫做XHTML表。開始的<TABLE>和結束 的</TABLE>(標記)沒有寫出,但有<TR><TH><TD>等分界符。html輸出對 CGI來說是相當有用地。
把結果寫到檔案中

.查詢資料庫結構

     sqlite3程式提供幾個有用的用於查詢資料庫結構的快捷命令。這些不是不可以用別的方式來實現。這些命令僅僅是一個快捷方式而已。
    例如,為了檢視資料庫的表列表,你可以敲入“.tables”。
sqlite> .tables
tbl1
tbl2
sqlite>
    .tables”命令相似於設定列表模式然後執行接下來的查詢:
SELECT name FROM sqlite_master WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'UNION ALL SELECT name FROM sqlite_temp_master WHERE type IN ('table','view') ORDER BY 1sqlite> .schema
create table tbl1(one varchar(10), two smallint)
CREATE TABLE tbl2 (
  f1 varchar(30) primary key,
   f2 text,
   f3 real
)
sqlite> .schema tbl2
CREATE TABLE tbl2 (
   f1 varchar(30) primary key,
   f2 text,
   f3 real
)
sqlite>

.事實上

你可以檢視sqlite3的原始碼(可以在原始檔樹的src/shell.c中),你可找到上面的具體的查詢。
.indices” 命令作用類似的方式是列出特定表的所有的索引。“.indics”命令須一個引數即所要索引表的表名。最後,但不是至少,是“.schema”命令。不帶 任何引數,“.schema”命令顯示原始的用於建立當前資料庫的CREATE TABLECREATE INDEX語句。如果你給".schema"命令一個表名,它顯示原始的建立該表和它所有索引的CREATE語句。我們可以:
".schema"命令可以用設定列表然後執行以下查詢來實現:
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type!='meta'ORDER BY tbl_name, type DESC, name
或者,如果你給".schema"命令一個引數,由於你只想得到一個表的結構,查詢可以是這樣:
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'ORDER BY substr(type,2,1), name
你可以擔供一個引數給.schema命令。如果這橛,查詢可以是這樣的:
SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master)WHERE tbl_name LIKE '%s' AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'ORDER BY substr(type,2,1), name
在查詢中“%S“為你的引數所取代。這使你可以詢資料庫結構的某個子集。
sqlite> .schema %abc%
與這些一起,“.table”命令也接受一個模式作為他的引數。如果你給“.table”一個引數,“%”將被前後擴充套件並且一個LIKE子句被附加到查詢上。這讓你可以列出只與特定模式相匹配的的表。
.databases” 命令顯示所有當前連線開啟的資料庫的一個列表。將允許一次到少兩個。第一個是“main”,最初開啟的那個資料庫。第二個是"temp",用於臨時表的數 據庫。對於用ATTACH語句附加的資料也許有附加資料庫列表。輸出的第一列與之相聯的資料庫名,第二列是外部檔名。
sqlite> .databases

.將整個資料庫轉換為ASCII文字檔案

".dump"命令成一個單一的ASCII文字檔案。這個檔案可以被用作管道傳遞給sqlite3命令來轉換回資料庫。
一個最好的製作一個數據庫檔案拷貝的命令是:
$ echo '.dump' | sqlite3 ex1 | gzip -c >ex1.dump.gz
它產生一個一個名為ex1.dump.gz的檔案,它包含了你以後或在其它機器上重構資料庫的所有的資訊。要重構資料庫,只須敲入:
$ zcat ex1.dump.gz | sqlite3 ex2
這個文字格式是純粹的SQL語句所以你可以用.dump命令來匯出一個SQLite資料庫到另一個常用的SQL資料庫引擎。比如:
$ createdb ex2
$ sqlite3 ex1 .dump | psql ex2

.Sqlite3 表結構和資料的匯出匯入

資料庫結構匯出和匯入:

.output” 預設情況下,sqlte3把結送到標準輸出。你可以用“.output”命令改變它。只須把輸出檔名做為.output命令的輸出引數然後所有後續查詢結果將被寫到那個檔案中。

用“.output stdout”再一次改為標準輸出。例如:

全部匯出 $sqlite3 data.db 
sqlite >.output dd 
sqlite >.dump

sqlite > .exit

$cat dd               //以下是資料庫的結構

PRAGMA foreign_keys=OFF;

BEGIN TRANSACTION;

CREATE TABLE long(h,m);

INSERT INTO "long" VALUES('hhhhhh',2);

INSERT INTO "long" VALUES('hello',2);

INSERT INTO "long" VALUES('mall',5);

INSERT INTO "long" VALUES('suinvzi',8);

INSERT INTO "long" VALUES('meimei',5);

CREATE TABLE bak(m varchar(10), n int);

INSERT INTO "bak" VALUES('hhhhhh',2);

INSERT INTO "bak" VALUES('hell',2);

INSERT INTO "bak" VALUES('mall',5);

INSERT INTO "bak" VALUES('suinvzi',8);

INSERT INTO "bak" VALUES('meimei',5);

COMMIT;

匯出表結構

sqlite >.output dd

sqlite >.schema

sqlite > .exit

$cat dd       //以下是表的結構

CREATE TABLE bak(m varchar(10), n int);

CREATE TABLE long(h,m);

全部匯入 : (.read命令,執行 FILENAME 中的 SQL語句)sqlite3 mydb.db 
sqlite >.read dd

sqlite >.tables

bak long          //匯入的是空表bak,long

資料的匯出和匯入:

匯出:例如:

$sqlite3 data.db
sqlite> .mode list
sqlite> .separator |
sqlite> .output test_file_1 
sqlite> select * from long;
sqlite> .exit
$ cat test_file_1 
hhhhhh|2

hello|2

mall|5

suinvzi|8

meimei|5
$

備註:每次匯出若為同一個文字,則正在匯出的內容覆蓋上次匯出的內容

匯入: 例如:(用.import 匯入的文字 被匯入的表 命令, 把檔案中的資料匯入表中)

$sqlite3 mydb.db 

sqlite> .show

     echo: off

   explain: off

  headers: off

    mode: list

nullvalue: ""

   output: stdout

separator: "|"

     stats: off

     width:
sqlite> .import test_file_1 long
sqlite> select * from long;
hhhhhh|2

hello|2

mall|5

suinvzi|8

meimei|5
匯入結束

備註:文字的內容所對應的資料分佈與所要匯入的表一致,元素間的分割符要與”.show”中separator: "|"的字元一致如果不一致可直接修改比如: sqlite>.separator ",將分隔符轉為逗號,不然匯入會出錯.

十一.其它的點命令

".explain命令可以被用來設定輸出格式為“column” 並設定列寬為EXPLAIN命令看起來比較合理的寬度。EXPLAIN命令是SQLite特有的SQL擴充套件,它是對除錯有用。如果任何常規的SQL被 EXPLAIN執行,那麼SQL命令被分解並分析但並不執行。取而代之的是,虛擬機器指令序列將被用於執行SQL命令並返回一個類似的查詢結果。如:
sqlite> .explain
sqlite> explain delete from tbl1 where two<20;
addr   opcode         p1      p2      p3          
----   ------------   -----   -----   -------------------------------------   
0      ListOpen       0       0                  
1      Open           0       1       tbl1        
2      Next           0       9                  
3      Field          0       1                  
4      Integer        20      0                  
5      Ge             0       2                  
6      Key            0       0                  
7      ListWrite      0       0                  
8      Goto           0       2                  
9      Noop           0       0                  
10     ListRewind     0       0                  
11     ListRead       0       14                 
12     Delete         0       0                  
13     Goto           0       11                 
14     ListClose      0       0
.timeout”命令設定sqlite3等待一個試圖儲存檔案鎖定請除直到錯誤返回的總時間。預設的超時值是0因此如果任何需要的資料庫表或序列列被鎖定時它將立即返回一個錯誤。
最後,我們提到“.exit”命令它將導致sqlite3退出。

十二.命令指令碼中使用sqlite3

一 個在指令碼命令中使用sqlite3的方式是用“echo”或“cat”來產生一個命令序列在一個檔案中,然後當從一個產生的命令列中重定向輸入時呼叫 sqlite3。它有用並且適應許多環境。但作為一附加的便利是,sqlite3允許一個單一的SQL語句在命令列中作為資料庫名後的第二個引數輸入。當 sqlite3程式帶著兩個引數啟動時,第二個引數被傳遞給SQLite庫處理,查詢以列表模式列印到標準輸出,然後程式退出。這個機制被設計用於讓 sqlite3容易於用於連線諸如"AWK"的程式。例如:
$ sqlite3 ex1 'select * from tbl1' |
> awk '{printf "<tr><td>%s<td>%s\n",$1,$2 }'
<tr><td>hello<td>10
<tr><td>goodbye<td>20
$

十三.結束命令列命令

SQLite 命令通常以一個分號結束。在一個命令列中你也可以用“GO”單詞(大小寫敏感)或者一個“/”斜線在它所在好行結束一個命令。這常被SQL ServerOracle使用。這些將sqlite3_exec()中有用,因為命令列在傳遞它們到函式之前把這些翻譯為分號。

十四.數化SQL語句

sqlite可以在shell/dos command底下直接執行命令:

對資料庫進行SQL操作:
sqlite3資料庫 "SQL語句 或 .命令;"

輸出 HTML 表格:
sqlite3 -html film.db "select * from film;"

將資料庫「匯出來」:
sqlite3 film.db ".dump" > output.sql
利用輸出的資料,建立一個一模一樣的資料庫(加上以上指令,就是標準的SQL資料庫備份了):

將資料庫「導進去」:
sqlite3 film.db < output.sql
在大量插入資料時,你可能會需要先打這個指令:
begin;
插入完資料後要記得打這個指令,資料才會寫進資料庫中:
commit;

十五.SQLITE深入------常見問題

1.如何建立自動增長欄位?

簡短回答:宣告為 INTEGER PRIMARY KEY 的列將會自動增長 。

(如果是最大可能的主鍵 9223372036854775807,那個,將鍵值將是隨機未使用的數。)如,有下列表:

CREATE TABLE t1(
a INTEGER PRIMARY KEY,
b INTEGER
);
在該表上,下列語句

INSERT INTO t1 VALUES(NULL,123);
在邏輯上等價於:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);
有一個新的API叫做 sqlite3_last_insert_rowid(), 它將返回最近插入的整數值。 注意該整數會比表中該列上的插入之前的最大值大1。 該鍵值在當前的表中是唯一的。但有可能與已從表中刪除的值重疊。要想建立在整個表的生命週期中唯一的鍵值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT宣告。那麼,新的鍵值將會比該表中曾能存在過的最大值大1。如果最大可能的整數值在資料表中曾經存在過,INSERT將會失敗, 並返回SQLITE_FULL錯誤程式碼。

2.多個應用程式或一個應用程式的多個例項可以同時訪問同一個資料庫檔案嗎?

多個程序可同時開啟同一個資料庫。多個程序可以同時進行SELECT 操作,但在任一時刻,能有一個程序對資料庫進行更改。

SQLite使用讀、寫鎖控制對資料庫的訪問。(在Win95/98/ME等不支援讀、寫鎖的系統下,使用一個概率性的模擬來代替。)但使用時要注意:如果資料庫檔案存放於一個NFS檔案系統上,這種鎖機制可能不能正常工作。 這是因為