PostgreSQL 外键2025年3月17日 | 阅读 14 分钟 在本节中,我们将了解 PostgreSQL 外键的工作原理、PostgreSQL 外键的示例,以及如何使用外键约束将 PostgreSQL 外键添加到表中。 什么是 PostgreSQL 外键 / 外键约束?外键是一组列,其值取决于另一张表中的主键。它用于在一列或一组列中显示的值与另一张表中相同列或列组合中显示的值相同。 外键也称为引用键,它匹配另一张表的主键字段,这意味着一张表中的外键字段引用另一张表的主键字段。 在 PostgreSQL 中,外键的值与另一张表中主键的实际值并行;因此它也被称为参照完整性约束。 PostgreSQL 外键约束指定子表中一组列或一列中的值,与父表中一组列或一列中的值等效。 换句话说,我们可以说外键使得能够生成表之间的父子关系。 在父子关系中,父表保留初始列值,而子表的列值引用父列值。 注意:PostgreSQL 表可以有多个外键,具体取决于它与其他表的连接。PostgreSQL 允许我们使用外键约束来描述外键。如何在 PostgreSQL 中创建外键在 PostgreSQL 中,我们可以借助以下命令创建外键
注意:在 PostgreSQL 中,ALTER TABLE 命令用于添加或删除主键。现在,我们将详细讨论每一个。 使用 CREATE TABLE 命令创建外键我们可以借助 CREATE TABLE 命令在 PostgreSQL 中创建外键。 创建外键的语法 以下插图用于在 PostgreSQL 中使用 CREATE TABLE 命令定义外键 在上面的语法中,我们使用了以下参数,我们将在下表中讨论 参数说明
在 PostgreSQL 中,我们有五种不同的参照选项,如下所示
让我们在下表中一一简要介绍五种不同的参照选项
使用 Create 命令的 PostgreSQL 外键示例为了理解 PostgreSQL 外键的工作原理,我们将看下面的示例,它描述了外键如何在 PostgreSQL 中使用。 在下面的命令中,我们将借助 CREATE 命令创建两个表 Employee 和 Department,并使用 INSERT 命令插入一些值。 要在 Javatpoint 数据库中创建 Employee,我们将使用 CREATE 命令。 在创建 Employee 表之前,如果 Javatpoint 数据库中存在相似的表,我们将使用 DROP TABLE 命令。 输出 执行上述命令后,我们将收到以下窗口消息,显示 Employee 表已成功删除。 ![]() 一旦之前创建的 Employee 表被删除,我们将创建一个新的 Employee 表,其中包含各种列,例如 Employee_id、Employee_name 列。 其中,Employee_id 列是 Generated Always as identity 约束。 输出 执行上述命令后,我们将收到以下消息:Employee 表已成功创建到 Javatpoint 数据库中。 ![]() 创建 Employee 表后,我们将借助 CREATE 命令在 Javatpoint 数据库中创建我们的第二个表,名为 Department 表。 在创建 Department 表之前,我们将使用 DROP TABLE 命令以确保 Javatpoint 数据库中不存在相似的表。 输出 执行上述命令后,我们将收到以下窗口消息:Department 已成功从 Javatpoint 数据库中删除。 ![]() 一旦 Department 表被删除,我们将创建一个新的 Department 表,其中包含各种列,例如 Department_id、Department_name 列。 输出 执行上述命令后,我们将收到以下消息:Department 表已成功创建到 Javatpoint 数据库中。 ![]() 在上面的示例中,Employee 表是父表,Department 表是子表。每个员工有零个或多个部门,每个部门属于零个或一个员工。 Department 表中的 Employee_id 列是外键列,它引用 Employee 表中同名主键列。 在以下语句中,Department 表中的外键约束 fk_Employee 指定 Employee_id 为外键 No Action 是默认选项,因为外键约束没有 ON DELETE 和 ON UPDATE 动作。 NO ACTION我们将借助 INSERT 命令向两个表(Employee 和 Department)中插入一些记录,以用于 NO ACTION 选项。 输出 执行上述命令后,我们将收到以下消息窗口,显示已成功将两个值插入 Employee 表中。 ![]() 在 Employee 表中插入值后,我们将使用 Insert 命令向 Department 表中输入一些记录,如下所示 输出 执行上述命令后,我们将收到以下消息窗口,显示已将四行插入 Department 表中。 ![]() 在下面的命令中,我们使用 DELETE 命令从 Employee 表中删除 Employee_id 1。 输出 执行上述命令后,PostgreSQL 因 ON DELETE NO ACTION 而发出以下错误: ![]() 换句话说,我们可以说 PostgreSQL 会发出约束违规,因为 Employee id=1 的引用行仍然存在于 Department 表中。 RESTRICTRESTRICT 操作类似于 NO ACTION。唯一的区别在于我们是否将外键约束指定为 DEFERRABLE,并使用 INITIALLY DEFERRED 或 INITIALLY IMMEDIATE 模式。 SET NULL了解了 NO ACTION 和 RESTRICT 选项的工作原理后,我们将了解 SET NULL 操作与外键的工作原理。 在下面的命令中,我们将创建两个新表,名为 Staff 和 Sector。 但是,首先,如果 Javatpoint 数据库中已存在类似的表,我们将使用 DROP TABLE 命令。 然后,我们将使用外键创建这些表,这些外键在 ON DELETE 子句中具有 SET NULL 操作 删除表 输出 执行上述命令后,我们将收到以下窗口消息:Staff 表不存在。 ![]() 现在,我们将借助 DROP table 命令删除 Sector 表。 输出 执行上述命令后,我们将收到以下消息窗口:Sector 表不存在。 ![]() 在 ON DELETE 子句中使用 SET NULL 选项创建表 输出 执行上述命令后,Staff 表已创建,如下图所示 ![]() 成功创建 Staff 表后,我们将使用 CREATE 命令创建 Sector 表,并在 ON DELETE 子句中也使用 SET NULL 操作 输出 执行上述命令后,我们将收到以下消息窗口,显示 Sector 表已成功创建到 Javatpoint 数据库中。 ![]() 成功创建 Staff 和 Sector 表后,我们将使用 INSERT 命令向其中插入一些值。 输出 执行上述命令后,我们将收到以下消息窗口,显示已成功将三个值插入 Staff 表中。 ![]() 在 Staff 表中插入值后,我们将借助 INSERT 命令向 Sector 表中输入一些记录,如下所示 输出 执行上述命令后,我们将收到以下消息窗口,显示已将五行插入 Sector 表中。 ![]() 成功将行插入两个表后,我们将了解 SET NULL 的工作原理。 为此,我们使用 DELETE 命令从 Staff 表中删除 staff_id=2,如下所示 输出 执行上述命令后,我们将收到以下消息窗口,显示已成功删除特定的 Staff_id。 ![]() 由于 ON DELETE SET NULL 操作,子表(Sector)中的引用行设置为 NULL。 在下面的命令中,我们将使用 SELECT 命令查看 Sector 表中存在的数据 输出 执行上述 SELECT 命令后,我们将得到以下输出,显示 Sector 表中 Staff_id=2 的行由于 ON UPDATE SET NULL 操作而自动设置为 NULL。 ![]() SET DEFAULT当从父表中删除引用行时,ON DELETE SET DEFAULT 用于将标准值设置为子表中引用行的外键列。 CASCADE当父表(Employee)中的引用行被删除时,ON DELETE CASCADE 选项会自动删除子表(Department)中的所有引用行。 注意:在 PostgreSQL 外键中,我们最常使用 ON DELETE CASCADE 选项。让我们看一个示例,了解 CASCADE 选项如何与外键一起使用。 在下面的命令中,我们将重新创建 Employee 和 Department 表。 在下面的示例中,我们将删除示例表(Employee 和 Department),并使用外键重新创建它们,该外键在 ON DELETE 子句中使用 CASCADE 动作 删除表 输出 执行上述命令后,我们将收到以下消息窗口:Employee 表已成功删除。 ![]() 一旦 Employee 表被删除,我们将借助 DROP 表命令删除 Department 表。 输出 执行上述命令后,我们将收到以下消息窗口:Department 表已成功删除。 ![]() 重新创建表成功删除两个表后,我们将使用外键重新创建这些表,该外键在 ON DELETE 子句中使用 CASCADE 操作。但是,fk_emloyee 的删除操作更改为 CASCADE 现在,我们将使用 CREATE TABLE 命令重新创建 Employee 表,如以下命令所示 输出 执行上述命令后,我们将收到以下消息:Employee 表已成功重新创建到 Javatpoint 数据库中。 ![]() 创建 Employee 表后,我们将借助 CREATE 命令在 Javatpoint 数据库中创建我们的第二个表 Department 表。 输出 执行上述命令后,我们将收到以下消息:Department 表已成功重新创建到 Javatpoint 数据库中。 ![]() 重新创建 Employee 和 Department 表后,我们将使用 INSERT 命令向两个表中插入一些记录。 输出 执行上述命令后,我们将收到以下消息窗口,显示已成功将两个值插入 Employee 表中。 ![]() 在 Employee 表中插入值后,我们将使用 Insert 命令向 Department 表中输入一些记录,如下所示 输出 执行上述命令后,我们将收到以下消息窗口,显示已将四行插入 Department 表中。 ![]() 在重新创建和重新插入两个表中的值后,我们将使用 DELETE 命令。 在下面的示例中,我们将从 Employee 表中删除 Employee_id=2。 输出 执行上述命令后,我们将收到以下消息窗口,显示已成功从 Employee 表中删除特定的 employee_id 值。 ![]() 由于我们在 Department 表中使用了 ON DELETE CASCADE 操作,因此 Department 表中的所有引用行都会自动删除。 换句话说,我们可以说,如果我们从 Employee 表中删除员工记录,那么 Department 表中的相关记录将自动删除。 为了检查上述 ON DELETE CASCADE 操作是否正常工作,我们将使用 SELECT 命令,如下面的语句所示 输出 在执行上述命令后,我们将获得以下输出 ![]() 如果我们要向现有表添加带有 ON DELETE CASCADE 选项的外键约束,我们将需要遵循以下步骤 步骤 1 首先,我们将使用下面的插图删除现有的外键约束 步骤 2 之后,我们将借助以下语法添加带有 ON DELETE CASCADE 操作的新外键约束 使用 ALTER TABLE 命令创建外键我们可以借助 ALTER TABLE 命令在 PostgreSQL 中生成外键。 ALTER TABLE 命令用于对现有表进行更改。有时,我们还可以向当前表列添加外键。 使用 ALTER TABLE 语句创建外键的语法 以下 ALTER TABLE 语句的插图用于在现有表中添加外键 注意:如果我们要使用 ALTER TABLE 命令添加外键,建议在由外键引用的不同列上创建索引。使用 ALTER TABLE 命令的 PostgreSQL 外键示例为了理解 PostgreSQL 外键的工作原理,我们将看下面的示例,它描述了如何通过 ALTER TABLE 命令在 PostgreSQL 中添加外键。 在下面的示例中,我们在 Javatpoint 数据库中创建两个新表,名为 Clients 和 Company,它们在表描述中不包含外键列。 为了创建 Clients 和 Company 表,我们将使用 CREATE TABLE 命令,如以下语句所示 输出 执行上述命令后,我们将收到以下消息窗口;Clients 表已成功创建到 Javatpoint 数据库中。 ![]() 一旦 Clients 表已生成,我们将使用 CREATE TABLE 命令创建子表(Company) 输出 执行上述命令后,我们将收到以下消息窗口,显示 Company 表已成功创建到类似的数据库中。 ![]() 成功创建父表(Clients)和子表(Company)后,如果我们要向现有表添加外键,可以执行以下 ALTER TABLE 命令 输出 执行上述命令后,我们将收到以下消息窗口,显示特定表已成功修改到类似的数据库中。 ![]() 如何删除 PostgreSQL 外键在 PostgreSQL 中,我们可以借助 ALTER TABLE 命令从现有表中删除外键。 使用 ALTER TABLE 命令删除外键的语法 以下插图用于借助 ALTER TABLE 命令在 PostgreSQL 中删除外键 在上面的语法中,我们使用了以下参数,我们将在下表中讨论
使用 ALTER TABLE 命令删除 PostgreSQL 外键的示例让我们看一个从已定义表中删除外键的示例。 为此,我们以上面新创建的 Employee 表为例,并借助 ALTER TABLE 命令删除外键,如以下语句所示 输出 执行上述命令后,我们将收到以下消息窗口,显示已成功从特定表中删除外键。 ![]() 概述在 PostgreSQL 外键部分,我们学习了以下主题
下一主题PostgreSQL 唯一约束 |
我们请求您订阅我们的新闻通讯以获取最新更新。