| |
| 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 来进行判断
| 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: |
| |
| var page1 = query.Paginate(1); |
| |
| foreach(var item in page1.Each) |
| { |
| |
| } |
| |
| var page2 = page1.Next(); |
| |
| foreach(var item in page2.Each) |
| { |
| |
| } |
| |
| |
| |
| 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(); |
| |
| |
| |
| |
| |
| |
| |
| |
| var db = new QueryFactory(connection, compiler); |
| |
| var query = db.Query("UsersTable").Where("Id", 1).Where("Status", "Active").First(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)