自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于sqlite遇到問題時(shí)的一點(diǎn)思考

數(shù)據(jù)庫 其他數(shù)據(jù)庫
本文主要介紹了在使用sqlite數(shù)據(jù)庫時(shí)遇到的一些問題,包括rowid和Integer主鍵及自增屬性的問題和Union的問題等,希望會(huì)對讀者有所幫助。

本文主要介紹sqlite數(shù)據(jù)庫遇到的一些問題以及解決的思路,接下來我們一一介紹。

rowid和Integer主鍵及自增屬性

大多數(shù)情況下,sqlite3的表都有一個(gè)rowid(也叫oid,_rowid_),這是一個(gè)64位的整數(shù),并作為sqlite存儲(chǔ)結(jié)構(gòu)B樹的主鍵。因此使用rowid查詢會(huì)比以其他設(shè)定的主鍵查詢,速度會(huì)非???。

在做插入操作的時(shí)候,對于rowid的值通常情況下不要去指定,讓系統(tǒng)自己去決定該去何值。因?yàn)閟qlite會(huì)通過SQLITE_SEQUENCE來追蹤表的rowid取值情況。而且sqlite定義了rowid的取值算法:在未超出rowid的范圍內(nèi),待插入記錄的rowid總是表中存在過的的rowid***值+1。比如依次插入5條記錄,此時(shí)***一條記錄的rowid是5,如果把這條記錄刪除再插入新記錄,此時(shí)新紀(jì)錄的rowid是6。而當(dāng)rowid達(dá)到所能表達(dá)的***值時(shí),這時(shí)如果有新紀(jì)錄要插入,系統(tǒng)就會(huì)隨機(jī)從之前的沒有使用過的正整數(shù)中隨機(jī)取一個(gè)作為rowid(就是之前刪除過的)。若沒有未使用的正整數(shù)并且你沒有在插入的時(shí)候制定rowid為某一個(gè)負(fù)數(shù)的話,系統(tǒng)就會(huì)拋出SQLITE_FULL的錯(cuò)誤。

如果在創(chuàng)建表的時(shí)候設(shè)置了主鍵,并且設(shè)置主鍵的那列是integer(不是int,short integer等等),并且主鍵沒有設(shè)定降序時(shí),這時(shí)的主鍵是rowid的別名,換言之,主鍵和rowid沒有區(qū)別。如果我們再設(shè)定主鍵autoincrement屬性時(shí)。和rowid又有什么區(qū)別呢?區(qū)別只是在于此時(shí)主鍵的取值是一個(gè)未使用過的rowid值,而這個(gè)rowid值系統(tǒng)會(huì)保證其是單調(diào)增長的,通常情況下就是表中存在過的rowid***值+1。這里所說的通常情況下是因?yàn)橛羞@樣一種情況:當(dāng)插入操作由于表約束而失敗的時(shí)候,本來要賦值的rowid,有可能不會(huì)在下次插入操作中使用,此時(shí)主鍵的取值就是表中存在過的rowid***值+2。

因此對于用戶id是整數(shù)的表,是單獨(dú)設(shè)主鍵去維護(hù)還是直接使用rowid作為主鍵,就取決于各自的業(yè)務(wù)邏輯關(guān)系了。在這種情況下,通常不使用rowid的主鍵特性。

Union All

今天遇到個(gè)問題, boss對app有了新的要求,具體到業(yè)務(wù)上就是:

假設(shè)有兩張表:

 

  1. create table A (username varchar(50), created datetime);  
  2.  
  3. create table B (nickname varchar(50), userID integer, added datetime); 

 

表A和表B之間沒有任何關(guān)系,唯一有聯(lián)系的就是有一列屬性都是datetime。而boss就需要將A和B的所有值取出并按時(shí)間排序。

乍一看不知道咋解決,因?yàn)閮蓮埍韯偤脹]有關(guān)系啊.后來才意識到可以用union,比如:

 

  1. select Null as col1, username as col2,created as col3 from A  
  2.  
  3. union all  
  4.  
  5. select nickname as col1, userid as col2,added as col3 from B  
  6.  
  7. order by col3; 

 

然后根據(jù)某一列值是否為空來生成不同的對象。

思考:

1.遇到這個(gè)問題后,首先想到的是join,但表又是沒有關(guān)系的,所以陷入了死胡同,跳出這個(gè)思維,從sql本身出發(fā),問題解決。

2.從軟件開發(fā)的角度,對于已經(jīng)進(jìn)行了一半的開發(fā),如果有新的需求,對于已有的軟件架構(gòu),數(shù)據(jù)庫結(jié)構(gòu)都會(huì)是一個(gè)挑戰(zhàn)。但這樣的變化往往是不可避免,尤其是在小公司,用scrum開發(fā)的環(huán)境下。遇到這樣的問題只能希望架構(gòu)師依靠自己的檢驗(yàn),設(shè)計(jì)出易于擴(kuò)展的架構(gòu)。

取出某一段數(shù)據(jù)

sqlite取出某一段數(shù)據(jù)是用limit,比如要取出第6-20條記錄,只需:

 

  1. select * from TableName limit 5,15. 

 

關(guān)于sqlite的問題總結(jié)就先介紹到這里,我們還會(huì)在以后的文章中接著介紹,感興趣的朋友可以繼續(xù)關(guān)注。

【編輯推薦】

  1. NetApp Filers提高數(shù)據(jù)庫的可用性和可靠性
  2. Exchange數(shù)據(jù)庫的恢復(fù)問題和可用性介紹
  3. 在Sql Server 2005中導(dǎo)出登錄用戶信息腳本
  4. 用CHARINDEX方法實(shí)現(xiàn)對字段按指定順序排序
  5. 簡述刪除SQL SERVER 2000數(shù)據(jù)庫日志的兩種方法
責(zé)任編輯:趙鵬 來源: 博客園
相關(guān)推薦

2011-12-23 09:16:19

2013-06-26 10:13:32

C語言結(jié)構(gòu)體結(jié)構(gòu)體偏移

2022-04-06 07:14:29

區(qū)塊鏈網(wǎng)絡(luò)生態(tài)系統(tǒng)

2011-07-04 09:33:04

惠普轉(zhuǎn)型李艾科

2012-03-27 08:49:19

Json

2024-04-28 14:54:09

機(jī)器人代碼

2011-07-18 16:56:12

Sqlite數(shù)據(jù)庫Update語句

2021-05-20 09:11:00

5G5G網(wǎng)絡(luò)5G終端

2009-01-20 14:04:58

數(shù)據(jù)挖掘信息整合應(yīng)用

2014-06-04 10:48:38

Swift蘋果iOS

2012-07-12 10:49:53

項(xiàng)目管理

2014-09-17 10:30:25

代碼

2010-02-02 15:10:01

Python程序

2023-11-08 10:14:02

模型學(xué)習(xí)

2021-05-17 11:47:41

多租戶系統(tǒng)私有化

2010-04-15 13:33:34

Oracle服務(wù)啟動(dòng)

2011-07-14 16:17:47

AmoebaMySQL

2009-08-03 09:17:30

ASP.NET Ses

2015-03-26 09:23:17

天璣科技融合架構(gòu)

2021-10-15 22:19:15

電腦藍(lán)屏重啟
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號