SQLite 中的主键和外键及示例

SQLite 约束

列约束用于强制执行插入到列中的值的约束和规则,以验证插入的数据。列约束在创建表时,在列定义中定义。

SQLite 主键

主键列中的所有值都应该是唯一的且非空的

主键只能应用于一个列,或者应用于一组列。在后一种情况下,一组列的值对于表中的所有行都必须是唯一的。

语法

有多种方法可以在表上定义主键,例如:

  • 在列定义本身中
    ColumnName INTEGER NOT NULL PRIMARY KEY;
  • 作为单独的定义
    PRIMARY KEY(ColumnName);
  • 创建一组列作为主键
    PRIMARY KEY(ColumnName1, ColumnName2);

非空约束

SQLite 非空约束可防止列为空值

ColumnName INTEGER  NOT NULL;

DEFAULT 约束

SQLite 默认约束:如果您不为某一列插入任何值,则将插入默认值。

例如

ColumnName INTEGER DEFAULT 0;

如果您编写了一个 insert 语句,但没有为该列指定任何值,则该列将具有值 0。

SQLite UNIQUE 约束

SQLite UNIQUE 约束:它将防止列中的所有值出现重复。

例如

EmployeeId INTEGER NOT NULL UNIQUE;

这将强制“EmployeeId”的值是唯一的,不允许重复的值。请注意,这仅适用于“EmployeeId”列的值。

SQLite CHECK 约束

SQLite CHECK 约束:这是一个用于检查插入值的条件。如果值不符合条件,则不会插入。

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

您不能在“Quantity”列中插入小于 10 的值。

SQLite 外键

SQLite 外键是一个约束,它验证在一个表中存在的值是否也存在于与第一个表相关的另一个表中,其中定义了外键。

在处理多个表时,当有两个表通过一个共同的列相互关联。如果您想确保其中一个表中插入的值必须存在于另一个表的列中,那么您应该在共同的列上使用“外键约束”。

在这种情况下,当您尝试在该列中插入值时,外键将确保插入的值存在于表的列中。

请注意,外键约束在 SQLite 中默认未启用,您需要先运行以下命令来启用它们

PRAGMA foreign_keys = ON;

外键约束从 SQLite 3.6.19 版本开始引入。

SQLite 外键示例

假设我们有两个表:Students 和 Departments。

Students 表列出了学生,Departments 表列出了系。每个学生都属于一个系;也就是说,每个学生都有一个 departmentId 列。

现在,我们将看到外键约束如何帮助确保 Students 表中的 departmentId 值必须存在于 Departments 表中。

SQLite Foreign Key

因此,如果我们为 Students 表中的 DepartmentId 创建了一个外键约束,那么每个插入的 departmentId 都必须存在于 Departments 表中。

CREATE TABLE [Departments] (
	[DepartmentId] INTEGER  NOT NULL PRIMARY KEY AUTOINCREMENT,
	[DepartmentName] NVARCHAR(50)  NULL
);
CREATE TABLE [Students] (
	[StudentId] INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
	[StudentName] NVARCHAR(50)  NULL,
	[DepartmentId] INTEGER  NOT NULL,
	[DateOfBirth] DATE  NULL,
	FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId)
);

为了检查外键约束如何防止未定义元素或值被插入到与另一个表有关联的表中,我们将研究以下示例。

在此示例中,Departments 表对 Students 表具有外键约束,因此插入到 Students 表中的任何 departmentId 值都必须存在于 Departments 表中。如果您尝试插入一个不存在于 Departments 表中的 departmentId 值,外键约束将阻止您这样做。

让我们像下面这样向 departments 表中插入两个系:“IT”和“Arts”。

INSERT INTO Departments VALUES(1, 'IT');
INSERT INTO Departments VALUES(2, 'Arts');

这两个语句应该会将两个系插入到 departments 表中,您可以通过运行查询“SELECT * FROM Departments”来确认这两个值已被插入。

SQLite Foreign Key

然后尝试插入一个 departmentId 不存在于 departments 表中的新学生

INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);

该行将不会被插入,您将收到一个错误消息:“FOREIGN KEY 约束失败。”