PostgreSQL教程

PostgreSQL 外键

在本节中,我们将了解 PostgreSQL外键的工作方式,示例 >> PostgreSQL外键,如何使用外键约束将PostgreSQL外键添加到表中。

什么是PostgreSQL外键/外键约束?

外键是一组列,其值取决于来自另一个表的主键。
外键也被称为,它用于在一个列或一组列中的值显示在同一列中,或在另一张表的列组合中。 strong>引用键,它与另一个表中的主键字段匹配,这意味着一个表中的外键字段引用了另一个表的主键字段。
在 PostgreSQL ,外键的值与另一个表中主键的实际值平行;这就是为什么它也称为引用完整性约束的原因。
PostgreSQL外键约束指定一组列中的值或子表,相当于父表的一组列或一列中的值。
换句话说,我们可以说键可以与表生成父子关系。
在父子关系中,父表保留初始列值,而子表的列值引用父列值。
注意: PostgreSQL表可以具有各种外键,这取决于它与其他表的连接。 PostgreSQL允许我们使用外键约束来描述外键。

如何在PostgreSQL中创建外键

在PostgreSQL中,我们可以借助以下命令来创建外键:
CREATE TABLE命令 ALTER TABLE命令
注意: 在PostgreSQL中,ALTER TABLE命令用于添加或删除主键。
现在,我们将详细讨论每个。

使用CREATE TABLE命令创建外键

我们可以使用CREATE TABLE命令的帮助在PostgreSQL中创建外键。
创建外键的语法
以下插图用于定义在PostgreSQL中使用 CREATE TABLE 命令的外键:
[CONSTRAint constraint_name]  
FOREIGN KEY [foreign_key_name] (column_name, ...)  
REFERENCES parent_table_name (column_name,...)  
[ON DELETE referenceOption]  
[ON UPDATE referenceOption]
在上面的语法中,我们使用了下表中讨论的以下参数:
参数说明
参数名称 说明
constraint_name 约束名称参数用于定义外键约束 如果我们不指定约束名称,PostgreSQL将自动创建约束名称。
column_name 用于指定要在其中创建外键的列名。 并且应在 FOREIGN KEY 关键字后的括号中写上。
Parent_table 父表参数定义父表的名称,后跟引用外键列的列名称。
Reference_option 它用于定义 ON DELETE和ON UPDATE 中的删除和更新操作 它还使用 Parent和Child 表之间的(ON DELETE和ON UPDATE)子句来验证外键是否保持引用完整性。
在PostgreSQL中,我们有五个不同的引用选项,如下所示:
设置默认值 设置为空 CASCADE 不采取行动 限制
让我们在下表中逐一介绍五个不同的引用选项:
参考选项 说明
SET DEFAULT PostgreSQL解析器标识 SET DEFAULT 仍然, InnoDB和NDB 表都排除了SET DEFAULT操作。
SET NULL SET NULL 引用选项在我们从父级 中删除或修改任何行时使用 子表中的外键列值设置为 NULL 。
CASCADE 如果我们要删除或修改父级表中的任何行,则将使用 CASCADE 子表中相应行的值将被删除或重复更新。
NO ACTION RESTRICT操作是在我们从父表中删除或修改任何行时使用的,该表在引用(子)表中具有相似的行。
RESTRICT 无操作引用操作类似于 RESTRICT 但是在我们尝试更新特定表后,它会验证参照完整性。

使用创建命令的PostgreSQL外键示例

要了解 PostgreSQL外键的工作原理,我们将看到以下示例,它描述了如何在PostgreSQL中使用外键。
在以下命令中,我们将创建两个表,分别为 Employee 和 Department ,其中创建命令的帮助,并使用 插入 插入一些值命令。
要在 lidihuo数据库中创建 Employee ,我们将使用 CREATE 命令。
在创建 Employee 表之前,我们将使用 DROP TABLE 命令(如果 lidihuo 数据库中存在类似的表)。
DROP TABLE if EXISTS Employee;
输出
执行上述命令后,我们将获得以下窗口消息,其中显示 Employee 表已成功删除。
PostgreSQL外键
先前创建的 Employee 表已删除,我们将创建一个新的 Employee 表,该表包含各种列,例如 Employee_id ,"雇员姓名" 列。
在此,雇员ID 列是作为身份约束始终生成的。
CREATE TABLE Employee(
   Employee_id int GENERATED ALWAYS AS IDENTITY,
   Employee_name VARCHAR(50) NOT null,
   PRIMARY KEY(Employee_id)
);
输出
在执行上述命令时,我们将收到以下消息: Employee 表具有已成功创建到 lidihuo 数据库中。
PostgreSQL外键
创建 Employee 表后,我们将创建我们的第二张表,该表名为 部门 表, lidihuo数据库,并具有 CREATE 命令的帮助。
在创建部门表之前,我们将使用 DROP TABLE 命令,以确保 lidihuo 数据库中不存在类似的表。
DROP TABLE if EXISTS Department;
输出
执行上述命令后,我们将获得以下窗口消息: 部门 已从 lidihuo 数据库成功删除。
PostgreSQL外键
一旦删除 部门 表,我们将创建一个新的 部门 表,其中包含各种列,例如部门ID,部门名称列。
CREATE TABLE Department(
Department_id int GENERATED ALWAYS AS IDENTITY,
Employee_id INT,
Department_name VARCHAR(200) NOT null,
PRIMARY KEY(Department_id),
CONSTRAint fk_Employee
FOREIGN KEY(Employee_id) 
REFERENCES Employee(Employee_id)
);
输出
在执行上述命令时,我们将收到以下消息: 部门 表具有已成功创建到 lidihuo 数据库中。
PostgreSQL外键
在上述示例中, Employee 表是父表和 部门 >表格是子表格。每个雇员有零个或多个部门,,每个部门属于零个或一个雇员。
部门 表中的 Employee_id 列是外键列,它引用了主键列在 Employee 表中具有相似的名称。
在以下语句中,fk_Employee 中的外键约束部门 表将 Employee_id 指定为外键:
CONSTRAint fk_Employee
FOREIGN KEY(Employee_id) 
REFERENCES Employee(Employee_id)
无操作是默认选项,因为外键约束没有 ON DELETE 和 ON UPDATE操作。

不执行操作

我们将同时向其中插入一些记录( 雇员和部门 )表,并带有无操作选项的 INSERT 命令帮助。
INSERT INTO Employee(Employee_name)
VALUES('John Smith'),
('Michael Brown');
输出
执行上述命令后,我们将获得以下消息窗口,其中显示两个值已成功插入进入 Employee 表。
PostgreSQL外键
将值插入 Employee 表后,我们将使用 Insert将一些记录输入 部门 表中命令,如以下命令所示:
INSERT INTO Department(Employee_id, Department_name)
VALUES(1,'Accounting'),
(1,'Accounting'),
(2,'Human Resource'),
(2, 'Human Resource-1');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示四行已插入 部门 表。
PostgreSQL外键
在以下命令中,我们使用 Delete 从 Employee 表中删除 Employee_id 1 命令。
DELETE FROM Employee
WHERE Employee_id = 1;
输出
执行上述命令后,由于 ON DELETE NO ACTION:
,PostgreSQL发出了以下错误:
Error: update or delete on table "employee" violates foreign key constraint "fk_employee" on table "department".
DETAIL: Key (employee_id)=(1) is still referenced from table "department".
SQL state: 23503

PostgreSQL外键
换句话说,我们可以说PostgreSQL发出了违反约束的规定 部门 表中仍存在 Employee id = 1 的引用行。

RESTRICT

限制操作类似于无操作。唯一的区别是当我们将外键约束指定为 DEFERRABLE 并采用 INITIALLY DEFERRED或INITIALLYLY IMMEDIATE 模式。

SET NULL

了解了 NO ACTION和RESTRICT 选项的工作原理之后,我们将了解 SET NULL 操作的工作原理
在下面的命令中,我们将创建两个名为 Staff 和 Sector的新表。
但是,首先,如果 lidihuo 中已经存在类似的表,我们将使用 DROP TABLE 命令数据库
然后,我们将使用外键创建那些表,该表在 ON DELETE 中具有 SET NULL 操作strong>子句:
删除表格
DROP TABLE if EXISTS Staff;
输出
执行上述命令后,我们将获得以下窗口消息: Staff 表不存在。
PostgreSQL外键
现在,我们将删除Sector 表,并带有 DROP表命令的帮助。
DROP TABLE if EXISTS Sector;
输出
执行上述命令后,我们将获得以下消息窗口: Sector 表
PostgreSQL外键
使用SET NULL创建表ON DELETE子句中的选项
CREATE TABLE Staff(
   Staff_id int GENERATED ALWAYS AS IDENTITY,
   Staff_name VARCHAR(50) NOT null,
   PRIMARY KEY(Staff_id)
);
输出
执行上述命令后,已创建 Staff 表,如我们在以下屏幕截图:
PostgreSQL外键
一旦 Staff表已成功创建,我们将使用 CREATE 命令创建 Sector 表,并使用 ON DELETE 子句中的SET NULL 操作:
CREATE TABLE Sector(
Sector_id int GENERATED ALWAYS AS IDENTITY,
Staff_id INT,
Sector_name VARCHAR(200) NOT null,
PRIMARY KEY(Sector_id),
CONSTRAint fk_Staff
FOREIGN KEY(Staff_id) 
REFERENCES Staff(Staff_id)
ON DELETE SET null
);
输出
执行上述命令后,我们将获得以下消息窗口,其中显示 Sector 表已成功创建到 lidihuo 数据库中。
PostgreSQL外键
一旦我们成功创建了 Staff 和 Sector 表,我们将使用以下方法在其中插入一些值 INSERT 命令。
INSERT INTO Staff(Staff_name)
VALUES('Sophia Smith'),
('Jessica Williams'),
('Victoria Lopez');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示三个值已成功插入 Staff 表。
PostgreSQL外键
在 Staff 表中插入值后,我们将在 Sector 表中输入一些记录, INSERT命令的帮助,如下所示:
INSERT INTO Sector(Staff_id, Sector_name)
VALUES(1,'Nursing'),
(1,'Nursing'),
(2,'Medication'),
(2, 'Medication'),
(3,'Accounting');
输出
在执行上述命令时,我们将获得以下消息窗口,该窗口显示 5 行已插入 Sector 表。
PostgreSQL外键
在将行成功插入两个表之后,我们将看到 SET NULL 的工作原理。
为此,我们将删除 staff_id = 2 ,如下所示:
DELETE FROM Staff
WHERE Staff_id = 2;
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示特定的 Staff_id 已成功删除。
PostgreSQL外键
子(扇区)表中的引用行由于 ON DELETE SET NULL 操作而设置为 NULL 。
在以下命令中,我们将使用 SELECT 命令以查看 扇区 表中的数据:
SELECT * FROM Sector;
输出
执行上述 SELECT 命令后,我们将获得以下输出,该输出显示带有的行由于 ON UPDATE SET NULL , 部门 表中的Staff_id = 2 自动设置为 NULL
PostgreSQL外键

设置默认值

ON DELETE SET DEFAULT 用于将标准值设置为子表中引用行的外键列,当从父级引用的行表。

CASCADE

ON DELETE CASCADE 选项会删除中的所有引用行删除父表(员工)中的引用行时,子表(部门)会自动出现。
注意: 在PostgreSQL外键中,我们最常使用ON DELETE CASCADE选项。
让我们看一个示例,以了解 CASCADE 选项与外键的工作方式。
在下面的命令中,我们将重新创建 Employee and Department 表。
在下面的示例中,我们将删除示例表 (员工和部门) ,并使用外键重新创建它们,该外键在 ON DELETE 子句中使用 CASCADE 操作:
删除表格
DROP TABLE if EXISTS Employee;
输出
实施above命令,我们将获得以下消息窗口: Employee 表已成功删除。
PostgreSQL外键
一旦删除 Employee 表,我们将删除 DROP 表命令的帮助下的Department 表。
DROP TABLE if EXISTS Department;
输出
执行上述命令后,我们将获得以下消息窗口: 部门 表已成功删除。
PostgreSQL外键

重新创建表

两个表均成功删除后,我们将使用外键重新创建这些表,该外键将在 ON DELETE 中使用 CASCADE 操作>子句。但是, fk_emloyee 的删除操作更改为 CASCADE :
现在,我们将重新创建 Employee 表,使用CREATE table命令,如以下命令所示:
CREATE TABLE Employee(
   Employee_id int GENERATED ALWAYS AS IDENTITY,
   Employee_name VARCHAR(50) NOT null,
   PRIMARY KEY(Employee_id)
);
输出
执行上述命令后,我们将得到以下消息: Employee 表具有已成功重新创建到 lidihuo 数据库中。
PostgreSQL外键
创建 Employee 表后,我们将第二个表 部门 表创建为 lidihuo数据库,其中包含 CREATE 命令的帮助。
CREATE TABLE Department(
Department_id int GENERATED ALWAYS AS IDENTITY,
Employee_id INT,
Department_name VARCHAR(200) NOT null,
PRIMARY KEY(Department_id),
CONSTRAint fk_Employee
FOREIGN KEY(Employee_id) 
REFERENCES Employee(Employee_id)
ON DELETE CASCADE
);
输出
执行上述命令时,我们将收到以下消息: 部门 表已被执行。已成功重新创建到 lidihuo 数据库中。
PostgreSQL外键
之后重新创建 Employee 和 部门 表,我们将使用 INSERT 插入少量记录到这两个表中strong>命令。
INSERT INTO Employee(Employee_name)
VALUES('John Smith'),
('Michael Brown');
输出
我们将获得以下消息窗口,该窗口显示两个值已成功插入 Employee 表。
PostgreSQL外键
在 Employee 表中插入值后,我们将使用 Insert 在 部门 表中输入一些记录/strong>命令,如以下命令所示:
INSERT INTO Department(Employee_id, Department_name)
VALUES(1,'Accounting'),
(1,'Accounting'),
(2,'Human Resource'),
(2, 'Human Resource');
输出
执行上述命令后,我们将获得以下消息窗口,该窗口显示四行已插入 部门 表。
PostgreSQL外键
在两个表中重新创建并重新插入这些值之后,我们将使用 DELETE 命令。
在下面的示例中,我们将删除 Employee 表中的 Employee_id = 2 。
DELETE FROM Employee
WHERE Employee_id = 2;
输出
在执行上述命令时,我们将获得以下消息窗口,该窗口显示特定的 employee_id 值已被删除成功地形成 Employee 表。
PostgreSQL外键
部门 表中的所有引用行都将被自动删除,因为我们在中使用了 ON DELETE CASCADE strong> 部门 表。
换句话说,如果我们从 Employee 中删除员工记录,则可以说表,则 部门 表中的相关记录已被自动删除。
检查上面的 ON DELETE CASCADE 操作是否正常,我们将使用SELECT命令,如下面的语句所示:
SELECT * FROM Department;
输出
执行上述命令后,我们将获得以下输出:
PostgreSQL外键
如果我们使用现有的表中的 ON DELETE CASCADE 选项添加外键约束,则需要执行以下步骤:
Step1
首先,我们将使用以下插图删除现有的外键约束:
ALTER TABLE child_table
DROP CONSTRAint constraint_fkey;
Step2
此后,我们将借助以下语法借助 ON DELETE CASCADE 操作添加新的外键约束:
ALTER TABLE child_table
ADD CONSTRAint constraint_fk
FOREIGN KEY (fk_columns)
REFERENCES parent_table(parent_key_columns)
ON DELETE CASCADE;

使用ALTER TABLE命令创建外键

我们可以在 ALTER TABLE 命令的帮助下在PostgreSQL中生成外键。
ALTER TABLE 命令用于对现有表进行更改表。有时,我们也可以向当前表列添加外键。
使用ALTER表语句创建外键的语法
以下在现有表中添加外键的 ALTER TABLE 语句的图示:
ALTER TABLE child_table 
ADD CONSTRAint [constraint_name] 
FOREIGN KEY (fk_columns) 
REFERENCES parent_table (parent_key_columns);
注意: 如果要使用ALTER TABLE命令添加外键,建议在外键引用的不同列上创建索引。

使用ALTER TABLE命令的PostgreSQL外键示例

要了解 PostgreSQL外键的工作原理,下面的示例描述了如何通过PostgreSQL中的ALTER table命令添加外键。
在下面的示例中,我们创建了两个名为 Clients 的新表。 strong>和 Company 到 lidihuo 数据库中,该数据库在表描述中不包含外键列。
要创建 客户和公司 表,我们将使用 CREATE 表命令,如以下语句所示:
CREATE TABLE Clients (  
Client_ID int NOT null,  
Client_Name varchar(55) NOT null,  
Client_location varchar(55) NOT null,  
PRIMARY KEY (Client_ID)  
);  
输出
执行以上命令后,将显示以下消息窗口; Clients 表已成功创建到 lidihuo 数据库中。
PostgreSQL外键
一旦生成 Clients 表,我们将创建使用 CREATE TABLE 命令创建子表(公司):
CREATE TABLE Company (  
  Company_id INT,  
  Client_Id INT,  
  Company_details varchar(50) NOT null,  
  Company_type varchar(50) NOT null  
); 
输出
执行上述命令后,我们将获得以下消息窗口,显示 Company 表已成功创建到相似的数据库。
PostgreSQL外键
在创建两个父级(客户端)表和 child(Company)表成功执行,如果在现有表中添加外键,则可以执行以下ALTER TABLE命令:
ALTER TABLE Company ADD CONSTRAint fk_Clients  
FOREIGN KEY ( Company_Id )REFERENCES Clients(Client_ID) 
ON DELETE CASCADE 
ON UPDATE RESTRICT;  
输出
执行上述命令后,我们将获得以下消息窗口,显示特定表已成功更改为类似数据库。
PostgreSQL外键

如何删除PostgreSQL外键

在PostgreSQL中,可以使用ALTER TABLE命令的帮助从现有表中删除外键。
使用alter table命令删除外键的语法
以下插图用于在PostgreSQL中使用ALTER TABLE命令的帮助下删除外键:
ALTER TABLE table_name 
DROP CONSTRAint constraint_fkey;
在上面的语法中,我们使用了以下参数,这些参数在下表中进行了讨论:
参数 说明
表名 表名参数用于指定要从中删除外键的表名。
constraint_Fkey 它用于定义在创建表时添加的外键名称。

使用ALTER TABLE命令删除PostgreSQL外键的示例

让我们看一个从已定义表中删除外键的示例示例。
为此,我们将使用上面新创建的 Employee 表,并在 ALTER TABLE 命令的帮助下删除外键,如图所示在以下语句中:
ALTER TABLE Department
DROP CONSTRAint fk_employee;  
输出
执行上述命令后,我们将获得以下消息窗口,显示外键已成功从特定表中删除。
PostgreSQL外键

概述

在 PostgreSQL中外键部分,已经学习了以下主题:
我们已使用 CREATE TABLE (创建表)命令为特定表创建外键。 我们已经了解了使用 CREATE TABLE 更改 PostgreSQL外键的概念。 我们还看到了引用操作选项的示例: SET NULL,NO ACTION,CASCADE,RESTRICT和SET DEFAULT。 我们已使用 ALTER TABLE 命令从特定表中删除外键。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4