資料庫 SQLite與SQL差異問題彙總

2021-06-29 02:45:45 字數 3866 閱讀 4068

編者注:這些關於sqlite與sql差異的問題,你是否遇到過呢?筆者在這裡為大家總結出了使用sqlite時,與sql之間經常會出現的一些差異性問題,希望對大家的使用有所幫助。

一、常見問題彙總

1 top

select

top10 * 

from

[index

] order

byindexid 

desc

;

但是這條sql語句在sqlite中是無法執行的,應該改為:

select

* from

[index

] order

byindexid 

desc

limit 0,10; 

其中limit 0,10表示從第0條記錄開始,往後一共讀取10條

2 建立檢視(create view)

sqlite在建立多表檢視的時候有乙個bug,問題如下:

create

view

watch_single 

asselect

distinctwatch_item.[watchid],watch_item.[itemid] 

from

watch_item; 

上面這條sql語句執行後會顯示成功,但是實際上除了

select

count

(*) 

from

[watch_single ] 

where

watch_ single.watchid = 1; 

能執行之外是無法執行其他任何語句的。其原因在於建立檢視的時候指定了字段所在的表名,而sqlite並不能正確地識別它。所以上面的建立語句要改為:

create

view

watch_single 

asselect

distinct

[watchid],[itemid] 

from

watch_item; 

但是隨之而來的問題是如果是多表的檢視,且表間有重名字段的時候該怎麼辦?

3 count(distinct column)

sqlite在執行如下語句的時候會報錯:

select

count

(distinct

watchid) 

from

[watch_item] 

where

watch_item.watchid = 1; 

其原因是sqlite的所有內建函式都不支援distinct限定,所以如果要統計不重複的記錄數的時候會出現一些麻煩。比較可行的做法是先建立乙個不重複的記錄表的檢視,然後再對該檢視進行計數。

4 外連線

雖然sqlite官方已經聲稱left outer join 已經實現,但還沒有 right outer join 和 full outer join。但是實際測試表明似乎並不能夠正常的工作。以下三條語句在執行的時候均會報錯:

select

tags.[tagid] 

from

[tags],[tag_rss] 

where

tags.[tagid] = tag_rss.[tagid](*);  

select

tags.[tagid] 

from

[tags],[tag_rss] 

where

left

outer

join

tag_rss.[tagid] = tags.[tagid];  

select

tags.[tagid] 

from

[tags],[tag_rss] 

where

left

join

tag_rss.[tagid] = tags.[tagid]; 

此外經過測試用+號代替*號也是不可行的。

二、收集sqlite與sql server的語法差異

1.返回最後插入的標識值

返回最後插入的標識值sql server用@@identity

sqlite用標量函式last_insert_rowid()

返回通過當前的 sqlconnection 插入到資料庫的最後一行的行識別符號(生成的主鍵)。此值與 sqlconnection.lastinsertrowid 屬性返回的值相同。

2.top n

在sql server中返回前2行可以這樣:

select

top2 * 

from

aa   

order

byids 

desc

sqlite中用limit,語句如下:

select

* from

aa   

order

byids 

desc

limit 2 

3.getdate ( )

在sql server中getdate ( )返回當前系統日期和時間

sqlite中沒有

4.exists語句

sql server中判斷插入(不存在ids=5的就插入)

if 

notexists (

select

* from

aa where

ids=5)   

begin

insert

into

aa(nickname)   

select

't'end

在sqlite中可以這樣

insert

into

aa(nickname)   

select

't'where

notexists(

select

* from

aa where

ids=5) 

5.巢狀事務

sqlite僅允許單個活動的事務

6.right 和 full outer join

sqlite不支援 right outer join 或 full outer join

7.可更新的檢視

sqlite檢視是唯讀的。不能對檢視執行 delete、insert 或 update 語句,sql server是可以對檢視 delete、insert 或 update

三、新增內容

1.關於日期時間型別列的預設設定:

對"列"的設定包括三個字段:name、type、default

name:logtime(隨意命名);

type:

date型別,得到的值形如"2011-04-23",

datetime型別,得到的值形如"2011-04-23 11:49:04.000";

default:datetime('now','localtime')  我採用的是兩個引數,後面的localtime不要丟棄,不然時間不準確。

SQLite 資料庫安裝與建立資料庫

嵌入式關聯式資料庫 ubuntu sudo apt getinstall sqlite3 sqlite3 dev centos,orfedora yum install sqlite3 sqlite3 dev 使用下面的命令來檢查您的機器上是否已經安裝了 sqlite。sqlite3 exit 退出...

SQLite資料庫損壞與修復

導致sqlite資料庫損壞的情況大致可歸結為4類 檔案覆蓋問題 檔案鎖問題 資料同步問題 記憶體問題 sqlite資料庫檔案被覆蓋是可能的,畢竟是乙個普通的磁碟檔案,意味著所有的程序都可以開啟和覆蓋,所以不可能完全避免檔案覆蓋的情況。1.多執行緒寫資料庫問題。sqlite資料庫是支援多程序併發讀寫,...

資料庫 Mysql 與 ORACLE 開發差異

中文描述 oracle 大小範圍 mysql 大小範圍 日期時間型別 date datetime 數值型別 number int,decimal 變長字串 varchar2 10 1 4000bytes varchar 0 65535bytes 定長字串 char 10 1 2000bytes ch...