约束是数据库中用于维护数据完整性和一致性的规则。它们在创建表时定义,并在插入、更新或删除数据时强制执行。SQLite 支持多种类型的约束,每种都有其特定的用途和重要性。
约束是应用于表中列的规则,用于限制可以插入到表中的数据类型。它们有助于确保数据的准确性和可靠性。SQLite 支持以下类型的约束:
让我们详细探讨每种约束。
PRIMARY KEY 约束用于唯一标识表中的每条记录。
SQLCREATE TABLE Students (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL
);
在这个例子中,StudentID
是自动递增的主键。
SQLite 也支持复合主键,即由多个列组成的主键:
SQLCREATE TABLE OrderItems (
OrderID INTEGER,
ProductID INTEGER,
Quantity INTEGER NOT NULL,
PRIMARY KEY (OrderID, ProductID)
);
UNIQUE 约束确保列中的所有值都是唯一的。
SQLCREATE TABLE Users (
UserID INTEGER PRIMARY KEY AUTOINCREMENT,
Email TEXT UNIQUE,
Username TEXT UNIQUE
);
在这个例子中,Email
和 Username
都必须是唯一的。
NOT NULL 约束确保列不能有 NULL 值。
SQLCREATE TABLE Employees (
EmployeeID INTEGER PRIMARY KEY AUTOINCREMENT,
FirstName TEXT NOT NULL,
LastName TEXT NOT NULL,
HireDate DATE NOT NULL
);
在这个例子中,FirstName
、LastName
和 HireDate
都不能为 NULL。
CHECK 约束用于限制列中的值范围。
SQLCREATE 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 约束用于为列指定默认值。
SQLCREATE TABLE Orders (
OrderID INTEGER PRIMARY KEY AUTOINCREMENT,
OrderDate DATE DEFAULT CURRENT_DATE,
Status TEXT DEFAULT 'Pending'
);
在这个例子中,如果不指定 OrderDate
,将使用当前日期;如果不指定 Status
,将使用 'Pending'。
FOREIGN KEY 约束用于防止破坏表之间的链接,它指向另一个表的 PRIMARY KEY。
SQLPRAGMA foreign_keys = ON;
SQLCREATE 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)。通常的做法是:
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;
约束是保证 SQLite 数据库中数据完整性和一致性的强大工具。通过正确使用 PRIMARY KEY、UNIQUE、NOT NULL、CHECK、DEFAULT 和 FOREIGN KEY 约束,可以大大提高数据的质量和可靠性。虽然 SQLite 在约束的灵活性方面可能不如一些其他数据库系统,但它提供了足够的功能来满足大多数应用程序的需求。
记住,约束应该反映业务规则和数据要求。正确实施约束可以防止许多常见的数据问题,并简化应用程序逻辑。然而,过度使用约束可能导致性能问题或不必要的复杂性。因此,在设计数据库架构时,需要仔细权衡和规划约束的使用。
通过深入理解和适当使用这些约束,您可以创建更加健壮和可靠的 SQLite 数据库。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!