sqlite3学习之表约束的使用

本文详细介绍了SQLite数据库中的约束概念,包括NOT NULL、DEFAULT、UNIQUE、PRIMARY KEY和CHECK约束的使用方法,以及它们如何确保数据库中数据的准确性和可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

约束是在表的数据列上强制执行的规则。这些是用来限制可以插入到表中的数据类型,确保了数据库中数据的准确性和可靠性。约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表。下面来看下在 SQLite 中常用的约束:

  • NOT NULL 约束:确保某列不能有 NULL 值。

  • DEFAULT 约束:当某列没有指定值时,为该列提供默认值。

  • UNIQUE 约束:确保某列中的所有值是不同的。

  • PRIMARY Key 约束:唯一标识数据库表中的各行/记录。

  • CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件。

默认情况下,列可以保存 NULL 值。如果我们不想某列有 NULL 值,那么需要在该列上定义此约束,指定在该列上不允许 NULL 值。NULL 与没有数据是不一样的,它代表着未知的数据。

我们来使用下面的 SQLite 语句创建一个新的表 COMPANY,并增加了五列,其中 ID、NAME 和 AGE 三列指定不接受 NULL 值:

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

 DEFAULT 约束在 INSERT INTO 语句没有提供一个特定的值时,为列提供一个默认值,我们来下面的 SQLite 语句创建一个新的表 COMPANY,并增加了五列。在这里,SALARY 列默认设置为 5000.00。所以当 INSERT INTO 语句没有为该列提供值时,该列将被设置为 5000.00:

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

UNIQUE 约束防止在一个特定的列存在两个记录具有相同的值。例如,在 COMPANY 表中,我们可能要防止两个或两个以上的人具有相同的年龄,我们来使用下面的 SQLite 语句创建一个新的表 COMPANY,并增加了五列。在这里,AGE 列设置为 UNIQUE,所以不能有两个相同年龄的记录:

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL UNIQUE,
   ADDRESS        CHAR(50),
   SALARY         REAL    DEFAULT 50000.00
);

PRIMARY KEY 约束唯一标识数据库表中的每个记录。在一个表中可以有多个 UNIQUE 列,但只能有一个主键。在设计数据库表时,主键是很重要的。主键是唯一的 ID。我们使用主键来引用表中的行。可通过把主键设置为其他表的外键,来创建表之间的关系。由于"长期存在编码监督",在 SQLite 中,主键可以是 NULL,这是与其他数据库不同的地方。主键是表中的一个字段,唯一标识数据库表中的各行/记录。主键必须包含唯一值。主键列不能有 NULL 值。一个表只能有一个主键,它可以由一个或多个字段组成。当多个字段作为主键,它们被称为复合键。如果一个表在任何字段上定义了一个主键,那么在这些字段上不能有两个记录具有相同的值,来看下例子:

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

CHECK 约束启用输入一条记录要检查值的条件。如果条件值为 false,则记录违反了约束,且不能输入到表,我们来使用下面的 SQLite 创建一个新的表 COMPANY,并增加了五列。在这里,我们为 SALARY 列添加 CHECK,所以工资不能为零:

CREATE TABLE COMPANY3(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL    CHECK(SALARY > 0)
);

SQLite 支持 ALTER TABLE 的有限子集。在 SQLite 中,ALTER TABLE 命令允许用户重命名表,或向现有表添加一个新的列。重命名列,删除一列,或从一个表中添加或删除约束都是不可能的。

好啦,本次记录就到这里了。

如果感觉不错的话,请多多点赞支持哦。。。

<think>嗯,用户让我介绍如何使用sqlite3一张。首先,我需要确认用户对SQLite的了解程度。可能他们刚开始接触数据库,或者已经有一些基础但需要具体步骤。我需要用简单明了的中文解释,避免使用专业术语过多,或者至少解释清楚术语。 首先,应该从连接到数据库开始。因为创之前必须有一个数据库连接。需要提到sqlite3.connect()函数,以及如果数据库不存在的话会自动创。可能用户不知道这一点,所以需要说明。 接下来,创的SQL语句。用户可能对CREATE TABLE语法不太熟悉,特别是字段类型和约束。需要举例说明,比如创一个用户,包含id、用户名、年龄等字段。每个字段的数据类型要选常见的,比如INTEGER、TEXT,还有主键和NOT NULL约束。 然后,需要提到游标对象的重要性,执行SQL语句,最后提交更改并关闭连接。这些步骤都是必要的,用户可能会漏掉提交或者关闭,导致数据没保存或者资源未释放。 可能用户会遇到的问题,比如已存在的错误,所以需要提到IF NOT EXISTS的用法。还有事务处理,自动提交的问题,但可能暂时不需要深入,保持简单。 还要考虑代码示例的结构,确保他们能复制粘贴并运行。比如Python中使用sqlite3模块的典型步骤:连接、游标、执行、提交、关闭。 另外,是否要提到数据类型在SQLite中的特点?比如动态类型系统,但可能对于初学者来说,保持基础更合适,避免混淆。 是否需要提醒用户处理异常?比如连接数据库时的权限问题,或者文件路径错误。不过用户可能只需要基础的创步骤,其他高级内容可以暂时省略。 最后,检查是否有常见的错误点,比如忘记游标执行,或者忘记提交。在示例中包括commit和close的调用,并说明它们的作用。 总结步骤:连接数据库,创游标,执行CREATE TABLE语句,提交,关闭连接。给出示例代码,并解释每个部分的作用。可能还需要提到字段约束,如主键和NOT NULL,以及如何根据需要添加更多字段。 是否应该解释SQL注入的问题?在这个阶段可能不需要,因为用户只是学习,还没到执行动态查询。暂时可以忽略。 确保使用中文,语句通顺,没有术语错误。可能用户需要的是直接可用的代码和步骤,所以重点放在代码示例和分步说明上。</think>以下是使用 SQLite3的步骤和示例: --- ### **1. 基本步骤** 1. **连接数据库**:使用 `sqlite3.connect()` 连接到数据库文件(不存在时会自动创)。 2. **创游标**:通过游标执行 SQL 命令。 3. **编写 SQL 语句**:使用 `CREATE TABLE` 定义结构和字段。 4. **执行并提交**:执行 SQL 后提交更改,关闭连接。 -- ### **2. 示例代码** ```python import sqlite3 # 连接到数据库(若不存在则新) conn = sqlite3.connect(&#39;mydatabase.db&#39;) cursor = conn.cursor() # 编写创的 SQL 语句 create_table_sql = """ CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, username TEXT NOT NULL, age INTEGER, email TEXT UNIQUE ); """ # 执行 SQL 语句 cursor.execute(create_table_sql) # 提交更改并关闭连接 conn.commit() conn.close() ``` --- ### **3. 关键语法说明** - **`CREATE TABLE IF NOT EXISTS`**:避免重复创同名。 - **字段定义**: - `id INTEGER PRIMARY KEY`:主键(自动递增)。 - `username TEXT NOT NULL`:文本类型,不可为空。 - `age INTEGER`:整数类型(可为空)。 - `email TEXT UNIQUE`:唯一约束(不允许重复)。 - **SQLite 数据类型**:`INTEGER`, `TEXT`, `REAL`(浮点数), `BLOB`(二进制)等。 --- ### **4. 验证是否创成功** 可通过以下代码查询所有名: ```python cursor.execute("SELECT name FROM sqlite_master WHERE type=&#39;table&#39;;") print(cursor.fetchall()) # 输出类似 [(&#39;users&#39;,)] ``` --- ### **5. 注意事项** - 若未指定 `IF NOT EXISTS`,重复创同名会报错。 - 修改结构(如新增列)需使用 `ALTER TABLE`。 - 实际字段应根据需求设计(如是否允许空值、默认值等)。 希望这对你有帮助! 😊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值