举例说明什么是SQLite外键

1,378 阅读5分钟

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支持的外键的约束动作。