sqlite 版本更新維護, 表結構判斷, 更新

sqlite會自動維護一個系統表sqlite_master,該表存儲了咱們所建立的各個table, view, trigger等等信息。

sqlite_master表數據字段:
type:  類型,取值通常爲table, view
name:    
tbl_name:   表名
rootpage:

sql:建立表或者視圖的sql語句,能夠從該sql語句中判斷某字段是否存在

sqlite_master表結構以下:

    CREATE TABLE sqlite_master (   
    type TEXT,   
    name TEXT,   
    tbl_name TEXT,   
    rootpage INTEGER,   
    sql TEXT   
    )
————————————————
版權聲明:本文爲CSDN博主「小向光」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/wuyou1336/article/details/53770799

判斷數據庫是否存在, 表格式是否正確(版本更新時,很重要)

數據庫更新,能夠增長table_version 來進行判斷sql

table_version
(
    tb_name  varchar(32)
    tb_version UNSIGNED INTEGER NOT NULL
    comment varchar(128)
)


保存每一個table 版本日期,  有不一致,就修改,  歷史版本在代碼中有記錄,能夠按當前記錄,去修改表結構.


(若是差異太多, 就直接備份舊錶,人工導出csv數據, 而後 建立新表,再導入數據)從新寫代碼修改 並導入,或者直接改csv 文件




 sqlite_master中獲得 表結構的SQL語句,本身再逐個分析  
 
//表名已經確認
//解析括號,  
//, 獲得單個表結構數據,  逐個比較就行

或者直接所有比較?


CREATE TABLE [Table_1004A] (
                        [ChipID] UNSIGNED INTEGER NOT NULL PRIMARY KEY,
                        [ChipType] VARCHAR(32) NOT NULL,
                        [BatchID] UNSIGNED INTEGER NOT NULL,

                        [T1_TestMode] VARCHAR(32) ,
                        [T1_Timestamp] UNSIGNED INTEGER,
                        [T1_Temp] SMALLINT,
                        [T1_ErrSaAddrNum] UNSIGNED INTEGER,
                        [T1_ErrSaAddr] VARCHAR(256),
                        [T1_ChipResult] VARCHAR(64),
                        [T1_HandlerResult] UNSIGNED TINYINT,

                        [T2_TestMode] VARCHAR(32),
                        [T2_Timestamp] UNSIGNED INTEGER,
                        [T2_Temp] SMALLINT,
                        [T2_ErrSaAddrNum] UNSIGNED INTEGER,
                        [T2_ErrSaAddr] VARCHAR(256),
                        [T2_ChipResult] VARCHAR(64),
                        [T2_RepairedSaAddr] VARCHAR(256),
                        [T2_HandlerResult] UNSIGNED TINYINT ,
                          
                        [Comment] VARCHAR(256) 
                        )
                
                                                
                                                
SELECT name FROM sqlite_master 
WHERE type=’table’ 
ORDER BY name; 

    
 //ok
select * from sqlite_master; 
select type,name,sql from sqlite_master; 


select type,name,sql from sqlite_master order by name; 

select type,name,sql from sqlite_master WHERE name='Table_1004A';

===================數據庫

//默認升序
SELECT NumID,ChipID,BatchID,T1_Timestamp FROM main.Table_1004A WHERE Table_1004A.NumID >= 1000 ORDER BY ChipID;

1010    1301000100001000    100 1570877172
1011    1301000100002001    100 1570877359
1016    1301000100004001    100 1570879295
1015    1301000100004002    100 1570879275
1014    1301000100004004    100 1570879275
1013    1301000100004010    100 1570879275
1012    1301000100004020    100 1570879274


/*==========*/


//降序
SELECT NumID,ChipID,BatchID,T1_Timestamp FROM main.Table_1004A WHERE Table_1004A.NumID >= 1000 ORDER BY ChipID DESC;

1012    1301000100004020    100 1570879274
1013    1301000100004010    100 1570879275
1014    1301000100004004    100 1570879275
1015    1301000100004002    100 1570879275
1016    1301000100004001    100 1570879295
1011    1301000100002001    100 1570877359
1010    1301000100001000    100 1570877172
insert 硬盤的IO速度,最受影響. (若是primier key 是chipID, chipID插入順序不規律, 可是DB內部會使chipID變有序)
insert 的若是chipID 重複,就crash. 因此還要先查詢下,chipID是否已經有了.(T2 也先查詢下,沒有也報錯)

查詢時間由於chipID 用RBTree創建了有序索引,因此效率還算能夠, 5W記錄 8ms.


若是按照以前的表設計,  numID 爲 primier key autoincrease, (用NumID 爲索引創建RBTree)則insert 變快(由於每次都是自增的值,不用改位置), query變慢 chipID無序,



//HD(7200)   寫入速度:11個record每秒
SELECT COUNT(*) FROM "Table_1004A" WHERE T1_Timestamp =1571039500;


//SSD(TLC)   寫入速度:50個record每秒
SELECT COUNT(*) FROM "Table_1004A" WHERE T1_Timestamp =1571040594;


//Memory   寫入速度:大約14757個record每秒(100W/70s),cpu i5-8400@2.8G 負載25%(可能只用到了單核心,多核心能夠加倍), 內存佔用100MB左右
SELECT COUNT(*) FROM "Table_1004A" WHERE T1_Timestamp =1571122590;  //查詢時間118ms


 
SELECT * FROM "Table_1004A" WHERE ChipID=1301000100001000;

//單值修改 

UPDATE employees
SET lastname = 'Smith'
WHERE employeeid = 3;

//多值修改 
UPDATE table
SET column_1 = new_value_1,
    column_2 = new_value_2
WHERE
    search_condition 
ORDER column_or_expression
LIMIT row_count OFFSET offset;


/*==========*/
UPDATE Table_1004A SET T2_Timestamp=1571041417 WHERE ChipID=1301000100001011;


SELECT * FROM "Table_1004A" WHERE T2_Timestamp NOTNULL;

SELECT * FROM "Table_1004A" WHERE T2_Timestamp=1571041417;
Paginate 頁碼  共多少頁,每頁多少數據
https://sqlkata.com/docs/execution/fetching-records

var page1 = query.Paginate(1);

foreach(var item in page1.Each)
{
    // print items in the first page
}

var page2 = page1.Next(); // same as query.Paginate(2)

foreach(var item in page2.Each)
{
    // print items in the 2nd page
}

 

var users = query.Paginate(1, 10);

foreach(var user in users.Each)
{
    Console.WriteLine($"Id: {user.Id}, Name: {user.Name}");
}
//找到最大的rowid(若是是自定義的primaryKey, 好比 NumID  則均可以用,  反正是alias 別名)
SELECT  *,MAX(rowid) FROM Table_1004A;//推薦
SELECT  *,MAX(NumID  ) FROM Table_1004A;//推薦

SELECT rowid FROM Table_1004A ORDER BY ROWID DESC LIMIT(1);
SELECT *,rowid FROM Table_1004A ORDER BY ROWID DESC LIMIT(1);



//SELECT *,rowid  FROM Table_1004A LIMIT 53000,1000





//返回最後一次insert的rowid,若是沒有插入就返回0 (開機重啓後也返回0, 是記錄在內存中)
SELECT LAST_INSERT_ROWID();


//SELECT *  FROM Table_1004A where rowid=LAST_INSERT_ROWID();

SELECT *,rowid "NAVICAT_ROWID" FROM "main"."Table_1004A" LIMIT 53000,1000



//===============


//時間: 0.03s
INSERT INTO "main"."Table_1004A"("ChipID", "ChipType", "BatchID", "T1_TestMode", "T1_Timestamp", "T1_Temp", "T1_ErrSaAddrNum", "T1_ErrSaAddr", "T1_ChipResult", "T1_HandlerResult", 
"T2_TestMode", "T2_Timestamp", "T2_Temp", "T2_ErrSaAddrNum", "T2_ErrSaAddr", "T2_ChipResult", "T2_RepairedSaAddr", "T2_HandlerResult", "Comment") 
VALUES (1301000100005001, 'XM1004_A_DWL', 100, 'ArrayWR', 1571106878, 120, 5, '1,2,3,4,5', 'Finish_MarchC', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);



//INSERT後,  LAST_INSERT_ROWID() 結果顯示53102 + 顯示最後插入信息
    1. SELECT LAST_INSERT_ROWID();
    2. SELECT *,rowid FROM Table_1004A WHERE rowid= 53102;


//2句話,一句搞定
SELECT *,rowid FROM Table_1004A WHERE rowid=LAST_INSERT_ROWID();
//SQLiteConfigDbOpsEnum sQLiteConfigDbOpsEnum = SQLiteConfigDbOpsEnum.SQLITE_DBCONFIG_NONE;
            //connection.SetConfigurationOption(sQLiteConfigDbOpsEnum, );

            //var users = new XQuery(connection, compiler).From("Users").Limit(10).Get();

            var db = new QueryFactory(connection, compiler);
            // You can register the QueryFactory in the IoC container
            var query = db.Query("UsersTable").Where("Id", 1).Where("Status", "Active").First();

            /*
            var query = new Query()
                    .Select("client.Id")
                    .From("schema.client as c")
                    .Join("schema.order as o", "c.Id", "o.ClientId")
                    .WhereIn("c.Id", new[] { 1, 2, 3 });
            */
相關文章
相關標籤/搜索