PostgreSQL Foreign Key外键

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

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

外键是一组列,其值取决于来自另一个表的主键利益。它用于使一列或一组列中的值显示在另一个表中的同一列或列组合中。

外键也称为引用键,它与另一个表的主键字段匹配,这意味着一个表中的外键字段引用另一个表的主键字段。

PostgreSQL中,外键的值与其他表中主键的实际值平行;这就是为什么它也被称为Referential integrity Constraint的原因。

PostgreSQL外键约束指定了Child表中一组列或一列中的值,等同于Parent表中一组列或一列中的值。

换句话说,我们可以说外键可以与表生成父子关系。

在父子关系中,父表保留初始列值,子表的列值引用父列值。

如何在 PostgreSQL 中创建外键

在 PostgreSQL 中,我们可以借助以下命令创建外键:

  • CREATE TABLE命令
  • 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
  • 父表参数定义父表的名称,后跟列名,它引用外键列。
Refrence_option
  • 它用于定义ON DELETE 和 ON UPDATE中的删除和更新动作
  • 它还使用父表和子表之间的两个(删除和更新)子句验证外键是否保持参照完整性。

在PostgreSQL中,我们有五种不同的引用选项,分别是:

  • SET DEFAULT
  • SET NULL
  • CASCADE
  • NO ACTION
  • RESTRICT

让我们在下表中对五种不同的参考选项一一进行简单介绍:

参考选项 解释
SET DEFAULT
  • PostgreSQL 解析器识别SET DEFAULT
  • 尽管如此,InnoDB 和 NDB表都排除了 SET DEFAULT 操作。
SET NULL
  • 当我们从父项中删除或修改任何行时,将使用SET NULL引用选项
  • 子表中的外键列值设置为NULL。
CASCADE
  • 如果我们想从父表中删除或修改任何行,那么我们将使用CASCADE
  • 子表中相应行的值将被重复删除或更新。
RESTRICT
  • 当我们从父表中删除或修改任何行时,将使用 RESTRICT 操作,该行在引用(子)表中具有相似的行。
NO ACTION
  • NO ACTION引用动作类似于RESTRICT
  • 但它有一个区别,即在我们尝试更新特定表后验证参照完整性。

使用 Create 命令的 PostgreSQL 外键示例

要了解PostgreSQL 外键的工作原理,我们将看到下面的示例,该示例描述了如何在 PostgreSQL 中使用外键。

在下面的命令中,我们将使用CREATE命令的帮助创建两个表作为Employee和Department并使用INSERT命令插入一些值。

要将Employee创建到Javatpoint 数据库中,我们将使用CREATE命令。

在创建Employee表之前,如果Javatpoint数据库中存在类似的表,我们将使用DROP TABLE命令

DROP TABLE IF EXISTS Employee;  

执行上述命令后,我们会得到如下窗口信息,显示Employee表已经删除成功。

删除之前创建的Employee表后,我们将创建一个新的Employee表,其中包含各种列,例如Employee_id、Employee_name列。

在此,Employee_id列是Generated Always as identity constraint。

CREATE TABLE Employee(  
   Employee_id INT GENERATED ALWAYS AS IDENTITY,  
   Employee_name VARCHAR(50) NOT NULL,  
   PRIMARY KEY(Employee_id)  
);  

执行上述命令后,我们将收到以下消息:Employee表已成功创建到Javatpoint数据库中。

创建Employee表后,我们将在CREATE命令的帮助下将第二个表(名为Department表)创建到Javatpoint 数据库中。

在创建Department表之前,我们将使用DROP TABLE命令确保Javatpoint数据库中不存在类似的表。

DROP TABLE IF EXISTS Department; 

执行上述命令后,我们将得到以下窗口消息:部门已从Javatpoint 数据库中成功删除。

删除Department表后,我们将创建一个新的Department表,其中包含各种列,例如Department_id、Department_name 列。

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)  
);  

执行上述命令后,我们将收到以下消息:Department表已成功创建到Javatpoint数据库中。

在上面的例子中,Employee表是父表, Department表是子表。每个员工有零个或多个部门,每个部门都属于零个或一个员工。

Department表中的Employee_id列是外键列,它引用了Employee表中同名的主键列。

在下面的语句中, Department表中的外键约束fk_Employee将Employee_id指定为外键:

CONSTRAINT fk_Employee  
FOREIGN KEY(Employee_id)   
REFERENCES Employee(Employee_id)  

 

热门文章

优秀文章