SQLite是一个开源的RDBMS(关系型数据库管理系统),它管理表内的数据。数据库中使用的表可以相互之间有关系,为了建立这种关系,需要使用外键。外键告诉人们哪个表与哪个表相连。
表之间的关系是关系型数据库的关键特征,它由外键和主键表示。在这篇文章中,我们将解释外键和它们在SQLite中的工作。
什么是外键?
外键是一个表中的值,它表示另一个表的主键。为了理解这一点,让我们考虑两个表,表A和表B。
表A | ||
| 学生编号(主键) | 学生姓名 | 教师身份 (外键) |
|---|---|---|
| 1 | 约翰 | 123 |
| 2 | 保罗 | 453 |
表B | ||
| 教师ID(Primary_key) | 教师姓名 | 允许的科目 |
|---|---|---|
| 123 | 亚历克斯 | 数学、物理 |
| 453 | 胡娜 | 化学,植物学 |
现在,在表A中,学生ID是该表的主键,教师ID是外键,但是在表B中,教师ID是主键。教师ID是一个外键,它在表A和表B之间建立了关系。
如何检查SQLite中外键的状态
SQLite在3.6.19版本发布后开始支持外键功能,因此要检查所安装的SQLite版本是否支持外键,在SQLite环境中执行以下命令。
PRAGMA foreign_keys;

输出可以是 "0 "或 "1",如果不显示任何输出,则意味着不支持外键。
| 输出结果 | 结果 |
|---|---|
| 0 | 外键被禁用 |
| 1 | 外键已启用 |
如何在SQLite中启用/禁用外键
要启用SQLite中的外键,请运行以下程序。
PRAGMA foreign_keys = ON;

我们可以禁用外键,只需在上面的命令中输入OFF而不是ON。为了确认外键已被启用,运行PRAGMA命令。
PRAGMA foreign_keys;

输出显示为1,这意味着外键已被启用。
使用外键的一般语法是什么?
使用外键创建表的一般语法是:
CREATE TABLE TABLE_NAME
(
column1 datatype [ NULL | NOT NULL ] PRIMARY KEY,
column2 datatype [ NULL | NOT NULL ] FOREIGN KEY,
...
FOREIGN KEY (column1, column2, ...))
REFERENCES parent_table (column1, column2 ...)
);
对它的解释是:
- 使用子句**"CREATE TABLE "**来创建一个表
- 用表的名称代替table_name
- 用他们的数据类型定义列,同时定义是否支持NULL/NOT NULL值
- 还提到了持有PRIMARY键和外键的列
- 使用语句FOREIGN KEY并在()中提到作为外键的列名
- 使用子句REFERENCE,用父表的名字替换父表,并提及它的外键。
外键在SQLite中是如何工作的
为了理解外键的工作,让我们考虑一个快递服务的例子,创建两个表,customer_details和shipment_details,这两个表有以下数据。
customer_details | ||
| 客户_ID | 客户名称 | 货件_ID |
|---|---|---|
| 1 | 约翰 | 5612 |
| 2 | 保罗 | 3467 |
货运_详情 | |||
| 货件_ID | 状态 | 来自(城市) | 至(城市) |
|---|---|---|---|
| 5612 | 已送达 | 伦敦 | 蒙特利尔 |
| 3467 | 进行中 | 布里斯托尔 | 卡迪夫 |
在表customer_details中,Customer_id是主键,Shipment_id是外键。而在表shipment_details中,shipment_id是主键。
如何在 SQLite 中添加一个外键
要创建一个表,customer_details,请执行以下命令。
CREATE TABLE customer_details( Customer_id INTEGER PRIMARY KEY, Customer_name TEXT NOT NULL, Shipment_id INTEGER NOT NULL, FOREIGN KEY (Shipment_id) REFERENCES shipment_details(Shipment_id));

在上面的命令中,我们提到了外键和主键,也提到了可以使用外键的表。在创建完 customer_details 表之后,我们将创建 shipment_details 表。
CREATE TABLE shipment_details (Shipment_id INTEGER PRIMARY KEY, STATUS TEXT, City_from TEXT, City_to TEXT);

现在要在customer_details表中插入数值,请使用以下命令。
INSERT INTO customer_details(Customer_id, Customer_name, Shipment_id) VALUES (1,'John', 5612), (2,'Paul', 3467);

我们可以看到,它产生了 "错误。FOREIGN KEY约束失败",产生这个错误的原因是我们参考了表shipment_id,这个表还没有值。因此,为了消除这个错误,首先,我们必须编辑 shipment_details 中的数据,即我们引用的外键。要在 shipment_details 表中插入数据,运行下面的命令。
INSERT INTO shipment_details(Shipment_id, STATUS, City_from, City_to) VALUES (5612, 'delivered', 'London', 'Manchester'), (3467,'In_process', 'Bristol', 'Cardiff');

要显示表,shipment_details,运行命令。
SELECT * FROM shipment_details;

现在,再次运行命令,使用语句在customer_details中插入数值。
INSERT INTO customer_details(Customer_id, Customer_name, Shipment_id) VALUES (1,'John', 5612), (2,'Paul', 3467);

该命令已经成功执行,没有产生 "外键约束失败 "的错误。要显示该表,请运行命令。
SELECT * FROM customer_details;

什么是外键约束的操作
你可以在父键上执行一些操作,作为子键响应的结果。一般的语法是。
FOREIGN KEY (foreign_key_column)
REFERENCES parent_table(parent_key_column)
ON UPDATE
ON DELETE ;
对这种语法的解释是
- 写下FOREIGN KEY的子句,并将 "foreign_key_column "替换为你的外键的名称。
- 用父表的名字替换 "parent_table",用父键的名字替换 "parent_key_columns"。
- 编写 "ON UPDATE "和 "ON DELETE "子句,并将""替换为你想执行的操作。
SQLite支持的动作在表中有说明
| 行动 | 动作描述 |
|---|---|
| 空值 | 当父键被删除时,子键列设置为空值 |
| 设置默认值 | 它的作用与Null动作相同,但不是给子键列设置空值,而是设置一个默认值。 |
| 无动作 | 当父数据库的父键发生变化时,子键不会发生变化 |
| 限制 | 它不允许用户添加或删除父键的值 |
| 级联 | 它将父表中的变化传递给子表。 |
总结
关系型数据库因其提供表间关系的功能而广受欢迎,SQLite作为关系型数据库之一,也支持这一功能。这些关系是在键的帮助下建立的,这些键被称为外键和主键。在SQLite中,应启用外键来使用它。在这篇文章中,我们了解了什么是SQLite中的外键以及它们是如何工作的。我们还讨论了SQLite支持的外键的约束动作。