赞
踩
SQLite是一种嵌入式关系型数据库管理系统,它是一个软件库,提供了一个自包含、无服务器、零配置的、事务性的SQL数据库引擎。与传统的数据库管理系统不同,SQLite不需要独立的服务器进程,不需要在系统中配置。
SQLite具有轻量级、高度可靠、易于使用的特点。它广泛应用于移动设备、嵌入式系统和小型应用程序中,但也可以在更大规模的应用中使用。
SQLite可以跨平台运行(Linux、Mac OS-X、Android、IOS、Windows)。
Qt的SQL模块中提供了一套统一的操作数据库的API,可以与多种数据库进行交互,其中就包括SQLite。只需要提供SQLite数据库文件,就可以使用Qt的数据库接口进行连接和操作。
SQLite数据库文件的一般后缀名是 .sqlite 、.db 、 .db3。这只是一般情况,其实,SQLite数据库文件的后缀名并不是强制的,可以根据喜好任意添加后缀名。
SQLite数据库文件实际上是二进制文件,而不仅仅包含数据的简单文本文件。所以,使用文本编辑器打开和修改SQLite数据库文件是行不通的。
在Qt环境中使用SQLite,不用安装。Qt sql 模块中包含。
属性名也叫作字段,每一行就是一条记录也叫作一个元组,每个单元格就是一个分量。
在关系型数据库中,有几种常见的键(Key)概念,下面是对它们的解释:
主键(Primary Key) | 主键是唯一标识数据库表中每一条记录的字段或字段组合。主键的值必须是唯一且不能为空,用于保证数据的完整性和唯一性。 |
外键(Foreign Key) | 外键是一个表中的字段,它与另一个表中的主键相关联,用于建立表与表之间的关联信息。外键在一个表中用于引用另一个表中的数据,用于实现数据之间的关联和完整性约束。 |
候选键(Candidate Key) | 候选键是可以作为主键的字段或字段组合。一个表可能有多个候选键,但只能选择一个作为主键。候选键的值在表中必须唯一,但可以为空。 |
超键(Super Key) | 能够唯一标识关系模式中的所有元组的属性集合。换句话说,超键是包含一条或多条属性的集合,这些属性的组合可以唯一地区分关系模式中的不同记录。 |
主属性(Primary Attribute) | 主属性是指关系模式中用来唯一标识每个记录的属性。主属性的值在整个表中必须是唯一的,用于保证数据的完整性和唯一性。通常情况下,主属性会被选择为主键。 |
非主属性(Non-Primary Attribute) | 非主属性是指除了主属性之外的其他属性,非主属性不用于唯一标识记录,但包含了记录的其他相关信息。非主属性的值可以重复,可以为空,不具备唯一性约束。 |
假如有两张数据库表如图:
学生表中,我们假设:只有学号和身份证号是唯一的,姓名、性别、学院编号、专业编号、出生日期、籍贯,它们之间任意组合都不唯一。
由超键的含义可知,学生表中含有学号或身份证号的任意组合都为此表的超键。如:
可以计算出共有3*(C(6,0) + C(6,1) + C(6,2) + C(6,3) + C(6,4) + C(6,5) + C(6,6))=192个超键。
候选键属于超键,它是最小的超键,就是说如果再去掉候选键中的任意一个属性它就不再是超键了,也就是说其中没有一个冗余的键。
因为我们之前的假设,姓名、性别、学院编号、专业编号、出生日期、籍贯,它们之间任意组合都不唯一。因此,学生表中的候选键为学号和身份证号。
如果我们取消掉之前的假设:也许会有更多的候选键,如:专业编号+出生日期(相当于说同一个专业没有同一天出生的学生,此时去掉任意一个条件,都不能确定唯一性,只有两个条件在一起,才有唯一性)等。
可以得知:候选键是超键的子集,超键是候选键的超集。
主键就是候选键里面的一个,是人为规定的。
因为主键是从候选键中人为选取的一个,而候选键并不一定都是单独的键,因此主键并不一定是单个属性,也可能是组合键。不过,通常都是单个属性做主键。
例如:学生表中我们用学号做主键,学院表中我们用学院编号做主键。
可以得知:主键是是候选键的子集,候选键是主键的超集。
外键比较简单,外键就是自己表中的其他表的主键。
例如:在我们将学院表中的学院编号作为学院表的主键的前提下,那么在学生表中的学院编号就是学生表中的外键。也许学生表中的专业编号是专业表的主键,那么学生表中的专业编号也是学生表中的外键。同样的,如果学院表中的院长编号是院长表的主键,那么学院表中的院长编号就是学院表的外键。
一张表中可以有零个或多个外键。
包含在任一候选码中的属性称主属性。简单来说,主属性是候选码所有属性的并集。
属性中非主属性的属性都是非主属性。有非黑即白那味儿。
SQLite遵循一套规则称为语法。
SQLite是不区分大小写的,但是也有一些命令是大小写敏感的,比如GLOB和glob在SQLite的语句中有不同含义。
SQLite注释是附加的注释,可以在SQLite代码中添加注释以增加其可读性。
两个连续的 “-” 字符(ASCII 0x2d)开始,并扩展到下一个换行符(ASCII 0x0a)或者直到输入结束。
也可使用C风格的注释,以 “/*” 开始,以 “*/” 结束,可以跨越多行。
- -- 这是注释
-
- /*
- 这也是注释
- 嗯,也是注释。
- */
NULL | 表示空值。 |
INTEGER | 表示整数,可以是正数、负数或零。 |
REAL | 表示浮点数,即带小数部分的数字。 |
TEXT(VARCHAR) | 表示文本,以UTF-8或UTF-16编码存储。 |
BLOB | 表示二进制数据,可以存储任意类型的数据,例如图像或声音文件。 |
DATE | 表示日期,以YYYY-MM-DD格式存储。 |
TIME | 表示时间,以HH:MM:SS格式存储。 |
DATETIME | 表示日期和时间,以YYYY-MM-DD HH:MM:SS格式存储。 |
TIMESTAMP | 表示时间戳,以自UTC纪元(1970-01-01 00:00:00)开始的秒数存储。 |
BOOLEAN | 表示布尔类型,可以是true或false。 |
注意:每一句SQLite语句结尾都要有 ; (分号)。
直接介绍Qt中SQLite的使用。
需要在Qt项目文件中加入: qt += sql
操作SQLite数据库时源代码中必须包含的头文件 :#include <QtSql>
- QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE", "myDatabase");
- database.setDatabaseName("path/to/database/file.db");
- if (database.open()) {
- // 连接成功,可以执行数据库操作
- database.close() //不需要连接时可以关闭连接
- } else {
- // 连接失败,可以处理错误逻辑
- }
SQL语句:
- CREATE TABLE "main"."Student" (
- "ID" TEXT NOT NULL,
- "Name" TEXT NOT NULL,
- "Gender" BOOLEAN NOT NULL,
- "CollegeID" TEXT NOT NULL,
- "MajorID" TEXT NOT NULL,
- "Birthday" DATE NOT NULL,
- "Birthplace" TEXT NOT NULL,
- "IDNumber" TEXT NOT NULL,
- PRIMARY KEY ("ID"),
- FOREIGN KEY ("CollegeID") REFERENCE "main"."College"("ID")
- );
-
- CREATE TABLE "main"."College" (
- "ID" TEXT NOT NULL,
- "Name" TEXT NOT NULL,
- "DeanID" TEXT NOT NULL,
- "BulidDay" DATE NOT NULL,
- PRIMARY KEY ("ID"),
- );
代码:
- QSqlQuery query(db);
- query.prepare("CREATE TABLE IF NOT EXISTS \"main\".\"Student\" ("
- "\"ID\" TEXT NOT NULL,"
- "\"Name\" TEXT NOT NULL,"
- "\"Gender\" BOOLEAN NOT NULL,"
- "\"CollegeID\" TEXT NOT NULL,"
- "\"MajorID\" TEXT NOT NULL,"
- "\"Birthday\" DATE NOT NULL,"
- "\"Birthplace\" TEXT NOT NULL,"
- "\"IDNumber\" TEXT NOT NULL,"
- "PRIMARY KEY (\"ID\"),"
- "FOREIGN KEY (\"CollegeID\") REFERENCES \"College\"(\"ID\")"
- ");");
- if(!query.exec()){
- qDebug()<<"建表失败1:"<<query.lastError();
- return;
- }
-
- query.prepare("CREATE TABLE IF NOT EXISTS \"main\".\"College\" ("
- "\"ID\" TEXT NOT NULL,"
- "\"Name\" TEXT NOT NULL,"
- "\"DeanID\" TEXT NOT NULL,"
- "\"BulidDay\" DATE NOT NULL,"
- "PRIMARY KEY (\"ID\")"
- ");");
- if(!query.exec()){
- qDebug()<<"建表失败2:"<<query.lastError();
- return;
- }
SQL语句:
- INSERT INTO "main"."College"
- ("ID", "Name", "DeanID", "BulidDay")
- VALUES
- ('XY01', '挖掘机学院', 'YZ0001', '2069-25-36');
-
-
- INSERT INTO "main"."Student"
- ("ID", "Name", "Gender", "CollegeID", "MajorID", "Birthday", "Birthplace", "IDNumber")
- VALUES
- ('XH00001', '陈大', '1', 'XY01', 'ZY001', '2035.13.36', '南天门', '1000000000000000')
代码:
- query.prepare("INSERT INTO \"main\".\"College\" "
- "(\"ID\", \"Name\", \"DeanID\", \"BulidDay\") "
- "VALUES "
- "('XY01', '挖掘机学院', 'YZ0001', '2069-25-36');");
- if(!query.exec()){
- qDebug()<<"插入数据失败1:"<<query.lastError();
- return;
- }
-
- query.prepare("INSERT INTO \"main\".\"Student\""
- "(\"ID\", \"Name\", \"Gender\", \"CollegeID\", \"MajorID\", \"Birthday\", \"Birthplace\", \"IDNumber\") "
- "VALUES "
- "('XH00001', '陈大', '1', 'XY01', 'ZY001', '2035.13.36', '南天门', '1000000000000000')");
- if(!query.exec()){
- qDebug()<<"插入数据失败2:"<<query.lastError();
- return;
- }
SELECT * FROM "main"."Student" WHERE "ID" LIKE '%XH00001%';
UPDATE "main"."Student" SET "Birthplace" = '那美克星球' WHERE "ID" = 'XH00001';
总而言之,就是将SQL语句拿到Qt中执行就行了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。