编辑
2025-09-28
SQLite
00

目录

什么是约束?
PRIMARY KEY 约束
特点:
语法:
复合主键:
UNIQUE 约束
特点:
语法:
NOT NULL 约束
特点:
语法:
CHECK 约束
特点:
语法:
DEFAULT 约束
特点:
语法:
FOREIGN KEY 约束
特点:
启用外键支持:
语法:
约束的修改和删除
示例:添加 UNIQUE 约束
最佳实践
结论

约束是数据库中用于维护数据完整性和一致性的规则。它们在创建表时定义,并在插入、更新或删除数据时强制执行。SQLite 支持多种类型的约束,每种都有其特定的用途和重要性。

什么是约束?

约束是应用于表中列的规则,用于限制可以插入到表中的数据类型。它们有助于确保数据的准确性和可靠性。SQLite 支持以下类型的约束:

  • PRIMARY KEY
  • UNIQUE
  • NOT NULL
  • CHECK
  • DEFAULT
  • FOREIGN KEY

让我们详细探讨每种约束。

PRIMARY KEY 约束

PRIMARY KEY 约束用于唯一标识表中的每条记录。

特点:

  • 每个表只能有一个 PRIMARY KEY。
  • PRIMARY KEY 列自动具有 UNIQUE 约束。
  • 通常,但不总是,PRIMARY KEY 是一个自动递增的整数。

语法:

SQL
CREATE TABLE Students ( StudentID INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT NOT NULL );

image.png

在这个例子中,StudentID 是自动递增的主键。

复合主键:

SQLite 也支持复合主键,即由多个列组成的主键:

SQL
CREATE TABLE OrderItems ( OrderID INTEGER, ProductID INTEGER, Quantity INTEGER NOT NULL, PRIMARY KEY (OrderID, ProductID) );

image.png

UNIQUE 约束

UNIQUE 约束确保列中的所有值都是唯一的。

特点:

  • 可以应用于一个或多个列。
  • 允许 NULL 值(除非同时指定了 NOT NULL)。
  • 一个表可以有多个 UNIQUE 约束。

语法:

SQL
CREATE TABLE Users ( UserID INTEGER PRIMARY KEY AUTOINCREMENT, Email TEXT UNIQUE, Username TEXT UNIQUE );

image.png

在这个例子中,EmailUsername 都必须是唯一的。

NOT NULL 约束

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

特点:

  • 强制列始终包含值。
  • 可以与其他约束结合使用。

语法:

SQL
CREATE TABLE Employees ( EmployeeID INTEGER PRIMARY KEY AUTOINCREMENT, FirstName TEXT NOT NULL, LastName TEXT NOT NULL, HireDate DATE NOT NULL );

image.png

在这个例子中,FirstNameLastNameHireDate 都不能为 NULL。

CHECK 约束

CHECK 约束用于限制列中的值范围。

特点:

  • 可以定义复杂的条件。
  • 适用于单个列或整个表。

语法:

SQL
CREATE TABLE Products ( ProductID INTEGER PRIMARY KEY AUTOINCREMENT, ProductName TEXT NOT NULL, Price DECIMAL(10,2) CHECK(Price > 0), Stock INTEGER CHECK(Stock >= 0) );

在这个例子中,Price 必须大于 0,Stock 必须大于或等于 0。

DEFAULT 约束

DEFAULT 约束用于为列指定默认值。

特点:

  • 当插入新记录时,如果没有为该列指定值,将使用默认值。
  • 可以是常量值、表达式或函数。

语法:

SQL
CREATE TABLE Orders ( OrderID INTEGER PRIMARY KEY AUTOINCREMENT, OrderDate DATE DEFAULT CURRENT_DATE, Status TEXT DEFAULT 'Pending' );

image.png

在这个例子中,如果不指定 OrderDate,将使用当前日期;如果不指定 Status,将使用 'Pending'。

FOREIGN KEY 约束

FOREIGN KEY 约束用于防止破坏表之间的链接,它指向另一个表的 PRIMARY KEY。

特点:

  • 确保引用完整性。
  • 默认情况下,SQLite 不强制执行外键约束,需要启用。

启用外键支持:

SQL
PRAGMA foreign_keys = ON;

语法:

SQL
CREATE TABLE Orders ( OrderID INTEGER PRIMARY KEY AUTOINCREMENT, UserID INTEGER, OrderDate DATE, FOREIGN KEY (UserID) REFERENCES Users(UserID) );

在这个例子中,Orders 表的 UserID 引用 Users表的 UserID

约束的修改和删除

SQLite 不直接支持 ALTER TABLE 语句来添加或删除约束(除了 NOT NULL)。通常的做法是:

  1. 创建一个新表,包含所需的约束。
  2. 将数据从旧表复制到新表。
  3. 删除旧表。
  4. 重命名新表。

示例:添加 UNIQUE 约束

SQL
-- 创建新表 CREATE TABLE Users_new ( UserID INTEGER PRIMARY KEY AUTOINCREMENT, Email TEXT UNIQUE, Username TEXT ); -- 复制数据 INSERT INTO Users_new SELECT * FROM Users; -- 删除旧表 DROP TABLE Users; -- 重命名新表 ALTER TABLE Users_new RENAME TO Users;

最佳实践

  1. 合理使用约束:约束可以提高数据质量,但过多的约束可能影响性能。
  2. 优先考虑数据库级约束:相比应用程序级的验证,数据库级约束更可靠。
  3. 使用有意义的命名:为约束使用描述性名称,特别是对于 CHECK 约束。
  4. 定期维护:随着业务规则的变化,定期审查和更新约束。
  5. 测试约束:在生产环境中应用之前,彻底测试约束的行为。
  6. 文档化:记录所有约束及其目的,以便将来维护。
  7. 考虑性能影响:某些约束(如复杂的 CHECK 约束)可能影响性能,需要权衡。

结论

约束是保证 SQLite 数据库中数据完整性和一致性的强大工具。通过正确使用 PRIMARY KEY、UNIQUE、NOT NULL、CHECK、DEFAULT 和 FOREIGN KEY 约束,可以大大提高数据的质量和可靠性。虽然 SQLite 在约束的灵活性方面可能不如一些其他数据库系统,但它提供了足够的功能来满足大多数应用程序的需求。

记住,约束应该反映业务规则和数据要求。正确实施约束可以防止许多常见的数据问题,并简化应用程序逻辑。然而,过度使用约束可能导致性能问题或不必要的复杂性。因此,在设计数据库架构时,需要仔细权衡和规划约束的使用。

通过深入理解和适当使用这些约束,您可以创建更加健壮和可靠的 SQLite 数据库。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!