青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

php SQLite學習筆記與常見問題分析

直到學會! 學之前找資料
SQLite
sql
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE

sqlite
常見問題
(1)
如何建立自動增長字段?
簡短回答:聲明為 INTEGER PRIMARY KEY 的列將會自動增長。
長一點的答案: 如果你聲明表的一列為 INTEGER PRIMARY KEY,那么, 每當你在該列上插入一NULL值時, NULL自動被轉換為一個比該列中最大值大1的一個整數,如果表是空的, 將會是1 (如果是最大可能的主鍵 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)SQLite3
支持何種數據類型?
NULL
INTEGER
REAL
TEXT
BLOB
但實際上,sqlite3也接受如下的數據類型:
smallint 16
位元的整數。
interger 32
位元的整數。
decimal(p,s) p
精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值 ,s是指小數點後有幾位數。如果沒有特別指定,則系統會設為 p=5; s=0
float 32
位元的實數。
double 64
位元的實數。
char(n) n
長度的字串,n不能超過 254
varchar(n)
長度不固定且其最大長度為 n 的字串,n不能超過 4000
graphic(n)
char(n) 一樣,不過其單位是兩個字元 double-bytes n不能超過127。這個形態是為了支援兩個字元長度的字體,例如中文字。
vargraphic(n)
可變長度且其最大長度為 n 的雙字元字串,n不能超過 2000
date
包含了 年份、月份、日期。
time
包含了 小時、分鐘、秒。
timestamp
包含了 年、月、日、時、分、秒、千分之一秒。
參見 http://www.sqlite.org/datatype3.html.
--------------------------------------------------------------------------------
(3)SQLite
允許向一個integer型字段中插入字符串!
這是一個特性,而不是一個bugSQLite不強制數據類型約束。任何數據都可以插入任何列。你可以向一個整型列中插入任意長度的字符串,向布爾型列中插入浮點數,或者向字符型列中插入日期型值。在 CREATE TABLE 中所指定的數據類型不會限制在該列中插入任何數據。任何列均可接受任意長度的字符串(只有一種情況除外:標志為INTEGER PRIMARY KEY的列只能存儲64位整數,當向這種列中插數據除整數以外的數據時,將會產生錯誤。
SQLite確實使用聲明的列類型來指示你所期望的格式。所以,例如你向一個整型列中插入字符串時,SQLite會試圖將該字符串轉換成一個整數。如果可以轉換,它將插入該整數;否則,將插入字符串。這種特性有時被稱為 類型或列親和性(type or column affinity).

--------------------------------------------------------------------------------
(4)
為什么SQLite不允許在同一個表不同的兩行上使用00.0作主鍵?
主鍵必須是數值類型,將主鍵改為TEXT型將不起作用。
每一行必須有一個唯一的主鍵。對于一個數值型列, SQLite認為 '0' '0.0' 是相同的, 因為他們在作為整數比較時是相等的(參見上一問題)。 所以,這樣值就不唯一了。

--------------------------------------------------------------------------------
(5)
多個應用程序或一個應用程序的多個實例可以同時訪問同一個數據庫文件嗎?
多個進程可同時打開同一個數據庫。多個進程可以同時進行SELECT 操作,但在任一時刻,只能有一個進程對數據庫進行更改。
SQLite
使用讀、寫鎖控制對數據庫的訪問。(在Win95/98/ME等不支持讀、寫鎖的系統下,使用一個概率性的模擬來代替。)但使用時要注意:如果數據庫文件存放于一個NFS文件系統上,這種鎖機制可能不能正常工作。 這是因為 fcntl() 文件鎖在很多NFS上沒有正確的實現。在可能有多個進程同時訪問數據庫的時候,應該避免將數據庫文件放到NFS上。在Windows上,Microsoft的文檔中說:如果使用 FAT 文件系統而沒有運行 share.exe 守護進程,那么鎖可能是不能正常使用的。那些在Windows上有很多經驗的人告訴我:對于網絡文件,文件鎖的實現有好多Bug,是靠不住的。如果他們說的是對的,那么在兩臺或多臺Windows機器間共享數據庫可能會引起不期望的問題。
我們意識到,沒有其它嵌入式的 SQL 數據庫引擎能象 SQLite 這樣處理如此多的并發。SQLite允許多個進程同時打開一個數據庫,同時讀一個數據庫。當有任何進程想要寫時,它必須在更新過程中鎖住數據庫文件。但那通常只是幾毫秒的時間。其它進程只需等待寫進程干完活結束。典型地,其它嵌入式的SQL數據庫引擎同時只允許一個進程連接到數據庫。
但是,Client/Server數據庫引擎(如 PostgreSQL, MySQL, Oracle)通常支持更高級別的并發,并且允許多個進程同時寫同一個數據庫。這種機制在Client/Server結構的數據庫上是可能的,因為總是有一個單一的服務器進程很好地控制、協調對數據庫的訪問。如果你的應用程序需要很多的并發,那么你應該考慮使用一個Client/Server 結構的數據庫。但經驗表明,很多應用程序需要的并發,往往比其設計者所想象的少得多。
SQLite試圖訪問一個被其它進程鎖住的文件時,缺省的行為是返回 SQLITE_BUSY。 可以在C代碼中使用 sqlite3_busy_handler() sqlite3_busy_timeout() API 函數調整這一行為。
---------------------------------------------------------------------------
(6)SQLite線程安全嗎?
線程是魔鬼(Threads are evil)。 避免使用它們。
SQLite
是線程安全的。由于很多用戶會忽略我們在上一段中給出的建議, 我們做出了這種讓步。但是,為了達到線程安全,SQLite在編譯時必須將 SQLITE_THREADSAFE 預處理宏置為1。在WindowsLinux上,已編譯的好的二進制發行版中都是這樣設置的。如果不確定你所使用的庫是否是線程安全的,可以調用 sqlite3_threadsafe() 接口找出。
3.3.1 版本之前,一個 sqlite3 結構只能被用于調用 sqlite3_open 創建的同一線程。你不能在一個線程中打開數據庫,然后將數據庫句柄傳遞給另外一個進程使用。這主要是由于在好多通用的線程實現(如RedHat9)中的限制引起的(是Bug嗎?)。特別的,在有問題的系統上,一個進程創建的 fcntl() 鎖無法被其它線程清除或修改。 所以,由于 SQLite 大量使用 fcntl() 鎖做并發控制,如果你在不同的線程間移動數據庫連接,就可能會出現嚴重的問題。
3.3.1版本上,關于在線程間移動數據庫連接的限制變得寬松了。 在它及以后的版本中,只要連接沒有持有 fcntl() 鎖,在線程間移動句柄是安全的。 如果沒有未決的事務,并且所有的語句都已執行完畢, 你就可以安全的假定不再持有任何鎖。
UNIX中,在執行 fork() 系統調用時不應攜帶已打開的數據庫進入子進程。那樣做將會有問題。

--------------------------------------------------------------------------------
(7)
SQLite數據庫中如何列出所有的表和索引?
如果你運行 sqlite3 命令行來訪問你的數據庫,可以鍵入 “.tables”來獲得所有表的列表。或者,你可以輸入 “.schema” 來看整個數據庫模式,包括所有的表的索引。輸入這些命令,后面跟一個LIKE模式匹配可以限制顯示的表。
在一個 C/C++ 程序中(或者腳本語言使用 Tcl/Ruby/Perl/Python 等) 你可以在一個特殊的名叫 SQLITE_MASTER 上執行一個SELECT查詢以獲得所有 表的索引。每一個 SQLite 數據庫都有一個叫 SQLITE_MASTER 的表,它定義數據庫的模式。 SQLITE_MASTER 表看起來如下:
CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT
);
對于表來說,type 字段永遠是 'table'name 字段永遠是表的名字。所以,要獲得數據庫中所有表的列表, 使用下列SELECT語句:
SELECT name FROM sqlite_master
WHERE type='table'
ORDER BY name;
對于索引,type 等于 'index', name 則是索引的名字,tbl_name 是該索引所屬的表的名字。 不管是表還是索引,sql 字段是原先用 CREATE TABLE CREATE INDEX 語句創建它們時的命令文本。對于自動創建的索引(用來實現 PRIMARY KEY UNIQUE 約束),sql字段為NULL
SQLITE_MASTER
表是只讀的。不能對它使用 UPDATEINSERT DELETE。 它會被 CREATE TABLECREATE INDEXDROP TABLE DROP INDEX 命令自動更新。
臨時表不會出現在 SQLITE_MASTER 表中。臨時表及其索引和觸發器存放在另外一個叫 SQLITE_TEMP_MASTER 的表中。SQLITE_TEMP_MASTER SQLITE_MASTER 差不多,但它只是對于創建那些臨時表的應用可見。如果要獲得所有表的列表, 不管是永久的還是臨時的,可以使用類似下面的命令:
SELECT name FROM
(SELECT * FROM sqlite_master UNION ALL
SELECT * FROM sqlite_temp_master)
WHERE type='table'
ORDER BY name

--------------------------------------------------------------------------------
(8) SQLite
數據庫有已知的大小限制嗎?
Windows Unix 下,版本 2.7.4 SQLite 可以達到 241次方字節 (2T 字節)。老版本的為 231 次方字節(2G 字節)
SQLite
版本 2.8 限制一個記錄的容量為 1MSQLite 版本 3.0 則對單個記錄容量沒有限制。
表名、索引表名、視圖名、觸發器名和字段名沒有長度限制。但 SQL 函數的名稱 ( sqlite3_create_function() API 函數創建) 不得超過 255 個字符。
對有關SQLite限制的詳細討論,見 limits.html

--------------------------------------------------------------------------------
(9)
SQLite中,VARCHAR字段最長是多少?
SQLite
不強制 VARCHAR 的長度。 你可以在 SQLITE 中聲明一個 VARCHAR(10)SQLite還是可以很高興地允許你放入500個字符。 并且這500個字符是原封不動的,它永遠不會被截斷。

--------------------------------------------------------------------------------
(10) SQLite
支持二進制大對象嗎?
SQLite 3.0
及以后版本允許你在任何列中存儲 BLOB 數據。 即使該列被聲明為其它類型也可以。

--------------------------------------------------------------------------------
(11)
SQLite中,如何在一個表上添加或刪除一列?
SQLite
有有限地 ALTER TABLE 支持。你可以使用它來在表的末尾增加一列,可更改表的名稱。如果需要對表結構做更復雜的改變,則必須重新建表。 重建時可以先將已存在的數據放到一個臨時表中,刪除原表, 創建新表,然后將數據從臨時表中復制回來。
如,假設有一個 t1 表,其中有 "a", "b", "c" 三列, 如果要刪除列 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;

--------------------------------------------------------------------------------
(12)
我在數據庫中刪除了很多數據,但數據庫文件沒有變小,是Bug嗎?
不是。當你從SQLite數據庫中刪除數據時, 未用的磁盤空間將會加入一個內部的自由列表中。 當你下次插入數據時,這部分空間可以重用。磁盤空間不會丟失,但也不會返還給操作系統。
如果刪除了大量數據,而又想縮小數據庫文件占用的空間,執行 VACUUM 命令。 VACUUM 將會從頭重新組織數據庫。這將會使用數據庫有一個空的自由鏈表, 數據庫文件也會最小。但要注意的是,VACUUM 的執行會需要一些時間(在SQLite開發時,在Linux上,大約每M字節需要半秒種),并且,執行過程中需要原數據庫文件至多兩倍的臨時磁盤空間。
對于 SQLite 3.1版本,一個 auto-vacumm 模式可以替代 VACUUM 命令。 可以使用 auto_vacuum pragma 打開。

--------------------------------------------------------------------------------
(13)
我可以在商業產品中使用SQLite而不需支付許可費用嗎?
是的。SQLite public domain。對代碼的任何部分沒有任何所有權聲明。你可以使用它做任何事。

--------------------------------------------------------------------------------
(14)
如何在字符串中使用單引號(')
SQL
標準規定,在字符串中,單引號需要使用逃逸字符,即在一行中使用兩個單引號。在這方面 SQL 用起來類似 Pascal 語言。 SQLite 尊循標準。如:
INSERT INTO xyz VALUES('5 O''clock');

--------------------------------------------------------------------------------
(15) SQLITE_SCHEMA error
是什么錯誤?為什么會出現該錯誤?
當一個準備好的(preparedSQL語句不再有效或者無法執行時,將返回一個 SQLITE_SCHEMA 錯誤。發生該錯誤時,SQL語句必須使用 sqlite3_prepare() API來重新編譯. SQLite 3 , 一個 SQLITE_SCHEMA 錯誤只會發生在用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 執行 SQL 時。而不會發生在使用 sqlite3_exec()時。 在版本2中不是這樣。
準備好的語句失效的最通常原因是:在語句準備好后, 數據庫的模式又被修改了。另外的原因會發生在:
數據庫離線:DETACHed.
數據庫被 VACUUMed
一個用戶存儲過程定義被刪除或改變。
一個 collation 序列定義被刪除或改變。
認證函數被改變。
在所有情況下,解決方法是重新編譯并執行該SQL語句。 因為一個已準備好的語句可以由于其它進程改變數據庫模式而失效,所有使用 sqlite3_prepare()/sqlite3_step()/sqlite3_finalize() API 的代碼都應準備處理 SQLITE_SCHEMA 錯誤。下面給出一個例子:
int rc;
sqlite3_stmt *pStmt;
char zSql[] = "SELECT .....";
do {
/* Compile the statement from SQL. Assume success. */
sqlite3_prepare(pDb, zSql, -1, &pStmt, 0);
while( SQLITE_ROW==sqlite3_step(pStmt) ){
/* Do something with the row of available data */
}
/* Finalize the statement. If an SQLITE_SCHEMA error has
** occured, then the above call to sqlite3_step() will have
** returned SQLITE_ERROR. sqlite3_finalize() will return
** SQLITE_SCHEMA. In this case the loop will execute again.
*/
rc = sqlite3_finalize(pStmt);
} while( rc==SQLITE_SCHEMA );

--------------------------------------------------------------------------------
(16)
為什么 ROUND(9.95,1) 返回 9.9 而不是 10.0 9.95不應該圓整 (四舍五入)嗎?
SQLite
使用二進制算術,在二進制中, 無法用有限的二進制位數表示 9.95 。使用 64-bit IEEE 浮點 (SQLite就是使用這個)最接近 9.95 的二進制表示是 9.949999999999999289457264239899814128875732421875。所在,當你輸入 9.95 時,SQLite實際上以為是上面的數字, 在四舍五入時會舍去。
這種問題在使用二進制浮點數的任何時候都會出現。 通常的規則是記住很多有限的十進制小數都沒有一個對應的二進制表示。 所以,它們只能使用最接近的二進制數。它們通常非常接近,但也會有些微小的不同,有些時候也會導致你所期望的不同的結果。

 

 

posted on 2009-06-23 21:25 肥仔 閱讀(1179) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合亚洲社区| 亚洲第一精品福利| 一区在线电影| 欧美一区二区三区播放老司机| 欧美高清视频免费观看| 欧美精品一区二区三区一线天视频| 嫩草成人www欧美| 欧美日韩精品高清| 国产精品资源在线观看| 国产丝袜美腿一区二区三区| 揄拍成人国产精品视频| 91久久久亚洲精品| 亚洲香蕉网站| 麻豆精品传媒视频| 91久久在线观看| 亚洲欧美第一页| 另类激情亚洲| 国产精品美女在线| 亚洲电影自拍| 午夜视频久久久久久| 久久综合久久综合久久综合| 亚洲国产精品专区久久| 亚洲欧美美女| 欧美激情a∨在线视频播放| 国产精品大片| 亚洲日本中文字幕| 欧美一级艳片视频免费观看| 亚洲福利小视频| 欧美在线啊v一区| 欧美人牲a欧美精品| 国模套图日韩精品一区二区| 在线视频精品一| 欧美高清视频一区二区| 亚洲欧美国产日韩中文字幕| 欧美激情亚洲另类| 一区二区三区在线视频播放 | 久久午夜精品一区二区| 欧美激情一区二区三区在线视频观看| 麻豆freexxxx性91精品| 夜夜嗨av一区二区三区| 免费的成人av| 国产综合欧美| 性做久久久久久| 一区二区三区.www| 欧美美女bb生活片| 亚洲国产视频直播| 久久裸体艺术| 香蕉久久精品日日躁夜夜躁| 欧美精品在线一区二区三区| 亚洲国产福利在线| 看片网站欧美日韩| 欧美一区影院| 亚洲免费视频网站| 欧美日韩高清一区| 亚洲精品美女免费| 欧美国产日韩亚洲一区| 久久久一本精品99久久精品66| 国产日本欧美一区二区| 亚洲综合色噜噜狠狠| 亚洲图片欧美一区| 你懂的视频一区二区| 在线观看91精品国产麻豆| 久久精品91久久久久久再现| 亚洲黄色高清| 激情欧美一区二区三区在线观看| 亚洲视频电影图片偷拍一区| 亚洲精品一区二区三区蜜桃久| 欧美日本一区二区高清播放视频| 日韩视频中文字幕| 日韩视频精品在线| 国产精品播放| 欧美专区在线观看一区| 欧美在线视频播放| 亚洲成人自拍视频| 亚洲国产婷婷香蕉久久久久久| 欧美成人视屏| 亚洲一区二区在线看| 一本色道久久综合| 国产日韩高清一区二区三区在线| 久久精品欧美| 欧美成人精品1314www| 亚洲一区二区欧美| 久久精品国产亚洲5555| 亚洲欧洲日本mm| 亚洲午夜伦理| 伊人久久亚洲热| 亚洲精品视频在线观看免费| 国产精品超碰97尤物18| 久久人人爽人人爽爽久久| 欧美成人精品影院| 久久精品盗摄| 欧美日韩国产成人在线91| 久久大逼视频| 欧美精品一区二区三区一线天视频 | 欧美亚日韩国产aⅴ精品中极品| 西瓜成人精品人成网站| 模特精品在线| 久久精品视频在线播放| 欧美另类视频在线| 久久先锋影音| 国产精品视频yy9299一区| 亚洲第一在线| 国产一区视频网站| 亚洲作爱视频| 亚洲精品免费一二三区| 欧美在线一区二区三区| 亚洲一区二区三区免费观看| 老牛国产精品一区的观看方式| 欧美一二三视频| 欧美日韩国产123区| 欧美a级在线| 国产在线乱码一区二区三区| 亚洲视频免费在线观看| 99精品99久久久久久宅男| 久久亚洲综合| 裸体一区二区三区| 亚洲电影中文字幕| 性欧美1819性猛交| 在线一区二区三区四区五区| 久久婷婷一区| 久久综合久久综合久久综合| 国产九九精品| 亚洲一区二区三区四区五区黄| 日韩一级免费| 欧美激情久久久久久| 欧美二区在线看| 在线观看av不卡| 久久久www成人免费无遮挡大片| 欧美一区二区视频在线| 国产精品日韩欧美一区| 亚洲一区二区三区四区中文 | 欧美体内谢she精2性欧美| 亚洲欧洲一区二区三区久久| 91久久极品少妇xxxxⅹ软件| 麻豆成人小视频| 亚洲国产精品久久久久秋霞影院| 亚洲成人在线观看视频| 玖玖精品视频| 亚洲国产日韩综合一区| 亚洲精品日韩在线观看| 欧美精品自拍偷拍动漫精品| 一个人看的www久久| 小黄鸭精品密入口导航| 韩国在线一区| 欧美成人有码| 亚洲最新在线| 欧美在线首页| 揄拍成人国产精品视频| 欧美电影免费观看高清完整版| 亚洲日本欧美| 亚洲综合色视频| 国产偷国产偷精品高清尤物| 久久久久久电影| 最新亚洲激情| 久久av老司机精品网站导航| 国产一区二区久久久| 久久免费视频观看| 日韩一区二区精品视频| 久久精品99无色码中文字幕| 尤物精品在线| 国产精品久久77777| 久久久久成人精品| 99re热精品| 久久久噜噜噜久久中文字幕色伊伊| ●精品国产综合乱码久久久久 | 国产人久久人人人人爽| 久久精品视频播放| 日韩一级不卡| 欧美阿v一级看视频| 亚洲制服av| 亚洲高清电影| 国产精自产拍久久久久久蜜| 欧美国产精品中文字幕| 欧美一级片一区| 亚洲美女av网站| 欧美成人亚洲成人日韩成人| 午夜精品久久久久久久蜜桃app | 亚洲精品国产精品久久清纯直播 | 欧美一区二区在线| 欧美大色视频| 欧美在线观看网站| 亚洲欧洲在线看| 国产一区在线播放| 欧美性色综合| 欧美激情亚洲| 久久久亚洲高清| 亚洲欧美日韩精品久久亚洲区| 亚洲国内在线| 免费日韩成人| 久久久www成人免费无遮挡大片| 一区二区三区欧美成人| 在线观看亚洲视频| 国产亚洲在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 美女爽到呻吟久久久久| 久久精品国产精品亚洲综合| 欧美伊人久久久久久午夜久久久久| 正在播放亚洲一区| 亚洲日本中文字幕免费在线不卡| 免费在线视频一区|