当前位置: 首页 > news >正文

第五章 SQLite数据库:4、SQLite 进阶用法:常见的约束、PRAGMA 配置、数据操作

SQLite PRAGMA

PRAGMA 命令用于查询和设置 SQLite 数据库的环境配置,可以帮助管理数据库的行为和性能。

语法

  1. 查询 PRAGMA 值:
PRAGMA pragma_name;
  1. 设置 PRAGMA 值:
PRAGMA pragma_name = value;

常见 PRAGMA 示例

1. auto_vacuum Pragma

控制数据库的自动清理模式,当启用时,SQLite 会自动回收已删除数据占用的空间。

-- 获取当前 auto_vacuum 设置
PRAGMA auto_vacuum;-- 设置为 FULL 模式,启用自动回收
PRAGMA auto_vacuum = FULL;

2. cache_size Pragma

设置数据库的缓存大小,这直接影响查询性能。

-- 获取当前缓存大小(单位:页面数)
PRAGMA cache_size;-- 设置缓存大小为 2000 页
PRAGMA cache_size = 2000;

3. case_sensitive_like Pragma

控制 LIKE 操作符是否区分大小写。

-- 设置 LIKE 匹配大小写敏感
PRAGMA case_sensitive_like = true;

4. journal_mode Pragma

控制事务日志的存储方式,影响数据库的事务处理和恢复性能。

-- 获取当前日志模式
PRAGMA journal_mode;-- 设置为 WAL(Write-Ahead Logging)模式
PRAGMA journal_mode = WAL;

5. max_page_count Pragma

设置数据库允许的最大页面数,控制数据库文件的最大大小。

-- 获取当前最大页面数
PRAGMA max_page_count;-- 设置最大页数为 5000000
PRAGMA max_page_count = 5000000;

SQLite 约束

SQLite 支持多种约束类型,用于确保数据的完整性和一致性。

常见约束类型

1. NOT NULL 约束

确保列的值不能为空。

-- 创建 EMPLOYEES 表,确保每一列不能为空
CREATE TABLE EMPLOYEES (ID INTEGER PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,AGE INTEGER NOT NULL,SALARY REAL NOT NULL
);

2. DEFAULT 约束

为列提供默认值,当插入数据时未提供该列的值时,使用默认值。

-- 创建 EMPLOYEES 表,为 SALARY 列设置默认值
CREATE TABLE EMPLOYEES (ID INTEGER PRIMARY KEY,NAME TEXT NOT NULL,AGE INTEGER NOT NULL,SALARY REAL DEFAULT 30000.0  -- 默认工资为 30000
);

3. UNIQUE 约束

确保列中的每个值唯一。

-- 创建 EMPLOYEES 表,确保每个 NAME 值唯一
CREATE TABLE EMPLOYEES (ID INTEGER PRIMARY KEY,NAME TEXT UNIQUE NOT NULL,AGE INTEGER,SALARY REAL
);

4. PRIMARY KEY 约束

唯一标识表中的每一行。一个表只能有一个主键。

-- 创建 EMPLOYEES 表,ID 列为主键
CREATE TABLE EMPLOYEES (ID INTEGER PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,AGE INTEGER,SALARY REAL
);

5. CHECK 约束

确保列值满足指定的条件。

-- 创建 EMPLOYEES 表,确保 SALARY 大于 0
CREATE TABLE EMPLOYEES (ID INTEGER PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,AGE INTEGER NOT NULL,SALARY REAL CHECK(SALARY > 0)
);

删除约束

SQLite 不支持直接删除列约束。如果需要修改约束,可以通过创建新表并迁移数据来实现。


SQLite 综合使用案例

以下是一个 SQLite 的综合使用案例,展示了如何使用 PRAGMA、创建表、插入数据、更新数据、查询数据以及应用不同约束:

-- 创建 PRODUCTS 表,包含多种约束
CREATE TABLE PRODUCTS (ID INTEGER PRIMARY KEY,          -- 主键NAME TEXT NOT NULL,              -- 名称不能为空CATEGORY TEXT NOT NULL,          -- 类别不能为空PRICE REAL CHECK(PRICE > 0),     -- 确保价格大于零QUANTITY INTEGER DEFAULT 0,      -- 默认数量为零CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 默认当前时间
);-- 插入数据
INSERT INTO PRODUCTS (NAME, CATEGORY, PRICE, QUANTITY)
VALUES ('Laptop', 'Electronics', 1200.00, 10),('Smartphone', 'Electronics', 800.00, 25),('Coffee Maker', 'Home Appliances', 150.00, 5);-- 更新产品价格
UPDATE PRODUCTS SET PRICE = 1100.00 WHERE NAME = 'Laptop';-- 查询价格大于 500 的产品
SELECT * FROM PRODUCTS WHERE PRICE > 500;-- 查询库存大于等于 10 的产品
SELECT * FROM PRODUCTS WHERE QUANTITY >= 10;-- 删除库存小于 10 的产品
DELETE FROM PRODUCTS WHERE QUANTITY < 10;-- 查询所有数据
SELECT * FROM PRODUCTS;-- 获取数据库当前页数
PRAGMA page_count;-- 设置数据库缓存大小
PRAGMA cache_size = 1000;-- 获取数据库日志模式
PRAGMA journal_mode;

解释:

  1. 创建表PRODUCTS 表包含了 PRIMARY KEYCHECKDEFAULTNOT NULL 等约束。
  2. 插入数据:插入了三条产品记录,每条记录的价格和库存数量都符合约束条件。
  3. 更新数据:更新了名为 Laptop 的产品价格。
  4. 查询数据:查询了价格大于 500 和库存大于等于 10 的产品。
  5. 删除数据:删除了库存小于 10 的产品记录。
  6. PRAGMA 使用:获取了当前数据库的页面数量,设置了缓存大小,查询了当前日志模式。

http://www.xdnf.cn/news/8011.html

相关文章:

  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)真题
  • 《软件设计师》复习笔记(4.2)——关系代数、函数依赖、范式
  • 下载HBuilder X,使用uniapp编写微信小程序
  • Linux简介
  • 下拉框select标签类型
  • PLOS ONE:VR 游戏扫描揭示了 ADHD 儿童独特的大脑活动
  • 基础数学知识-概率论
  • 机器学习05-CNN
  • 守护进程及gdb调试(新手简略版)
  • 工作总结(十二)——迁移svn单项目到gitlab上,保留历史提交记录
  • 02.Spring_IOC详解
  • Evidential Deep Learning和证据理论教材的区别(主要是概念)
  • test ssl java
  • 【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】
  • 数据结构学习笔记 :二叉搜索树与高效查找算法详解
  • React 列表渲染基础示例
  • DFS/BFS专练-搞定图论基础!(从海岛问题过渡至图论基础应用C++/C)
  • 无刷电机槽数相同、转子极数不同的核心区别
  • Nacos安装及数据持久化
  • ESP32之本地HTTP服务器OTA固件升级流程,基于VSCode环境下的ESP-IDF开发(附源码)
  • 【Spring Boot】MyBatis入门:连接Mysql数据库、测试单元、连接的常见错误
  • 汇编语言中的数据
  • 基于C++(MFC)的细胞识别程序
  • 人工智能在后端开发中的革命:从架构到运维
  • 前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联
  • 极狐GitLab 项目导入导出设置介绍?
  • 架构师面试(三十一):IM 消息收发逻辑
  • 手撕STL——vector
  • 利用DeepSeek设计一个HTML批量转换工具设计
  • Hadoop的三大结构及其作用?