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 }); */