SQLite primay key and autoincrement

本文详细介绍了在数据库表设计中使用INTEGER PRIMARY KEY时的特性,包括自动填充NULL值为下一个可用整数以及如何确保键值在整个表的生命周期中唯一。此外,还解释了通过添加AUTOINCREMENT属性来进一步保证键值唯一性的方法。

十九.如果将某个字段设置为INTEGER PRIMARY KEY属性,有什么特性?

如果将声明表的一列设置为 INTEGER PRIMARY KEY,则具有:

1.每当你在该列上插入一NULL值时, NULL自动被转换为一个比该列中最大值大1的一个整数;

2.如果表是空的, 将会是1;

注意 该整数会比表中该列上的插入之前的最大 值大1。 该键值在当前的表中是唯一的。但有可能与已从表中删除的值重叠。要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。

二十.字段声明中有AUTOINCREMENT属性,有什么与众不同的含义?

要想建立在整个表的生命周期中唯一的键值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT声明。那么,新的键值将会比该表中曾能存在过的最大值大1。

在 Qt 5.15.2 中使用 SQLite3 创建带有自增主键的表是完全可行的。SQLite 支持 `AUTOINCREMENT` 关键字来实现主键的自动递增功能,通常用于 `id` 字段,作为每条记录的唯一标识。 创建带有自增主键的表时,可以使用 `id INTEGER PRIMARY KEY AUTOINCREMENT` 语法。以下是一个基本的 SQL 语句示例,展示了如何在 Qt 中使用 SQLite3 创建这样的表: ```sql CREATE TABLE IF NOT EXISTS "example_table" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" TEXT(256), "description" TEXT(256), "created_at" TEXT ); ``` 在 Qt 中,可以通过 `QSqlQuery` 类来执行该 SQL 语句。例如: ```cpp #include <QSqlQuery> #include <QDebug> bool createTable() { QSqlQuery query; QString createTableSQL = "CREATE TABLE IF NOT EXISTS example_table (" "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " "name TEXT(256), " "description TEXT(256), " "created_at TEXT" ");"; if (!query.exec(createTableSQL)) { qDebug() << "Error: Failed to create table." << query.lastError(); return false; } qDebug() << "Table created successfully."; return true; } ``` 需要注意的是,SQLite 中的 `AUTOINCREMENT` 并非必须使用。如果只是需要自动递增的主键,可以仅使用 `INTEGER PRIMARY KEY`,SQLite 会自动为其分配一个递增的 `ROWID`,而无需显式声明 `AUTOINCREMENT`。两者的区别在于: - `AUTOINCREMENT` 强制要求每次插入新记录时生成一个比之前所有值都大的唯一整数,且不会复用已删除记录的 ID。 - `INTEGER PRIMARY KEY` 则允许复用已删除记录的 ID,这在某些场景下可能是更节省资源的选择[^1]。 因此,如果不需要严格保证 ID 不重复使用,可以省略 `AUTOINCREMENT`,使用如下语句即可: ```sql CREATE TABLE IF NOT EXISTS "example_table" ( "id" INTEGER PRIMARY KEY, "name" TEXT(256), "description" TEXT(256), "created_at" TEXT ); ``` 此外,当插入数据时,如果不指定 `id` 字段的值,SQLite 会自动为其分配一个递增的整数值。 如果需要设置默认值或触发其他操作(如插入时间戳),可以在创建表时添加默认值定义,例如: ```sql CREATE TABLE IF NOT EXISTS "example_table" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT, "name" TEXT(256), "description" TEXT(256), "created_at" TEXT DEFAULT (datetime('now', 'localtime')) ); ``` 这样,每次插入新记录时,如果没有指定 `created_at` 字段的值,系统会自动将当前时间戳作为默认值插入[^1]。 ### 示例:完整创建表并插入数据 ```cpp #include <QSqlQuery> #include <QDebug> bool createTableAndInsertData() { QSqlQuery query; // 创建表 QString createTableSQL = "CREATE TABLE IF NOT EXISTS example_table (" "id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, " "name TEXT(256), " "description TEXT(256), " "created_at TEXT DEFAULT (datetime('now', 'localtime'))" ");"; if (!query.exec(createTableSQL)) { qDebug() << "Error: Failed to create table." << query.lastError(); return false; } qDebug() << "Table created successfully."; // 插入数据 QString insertDataSQL = "INSERT INTO example_table (name, description) VALUES ('Test Entry', 'This is a test description');"; if (!query.exec(insertDataSQL)) { qDebug() << "Error: Failed to insert data." << query.lastError(); return false; } qDebug() << "Data inserted successfully."; return true; } ``` 通过上述方式,可以在 Qt 5.15.2 中使用 SQLite3 创建带有自增主键的表,并实现自动管理主键值、时间戳等功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值