外键是一个或多个列,其值取决于主键。这种约束条件用于连接两个表。在postgresql中,外键有助于产生表之间的关系,使一个表成为父表,另一个成为子表。外键可以通过使用以下方式创建
- CREATE表查询
- UPDATE/ALTER查询
语法
[CONSTRAINT name] FOREIGN KEY(columns)
REFERENCES parent_table(columns)
[ON DELETE action]
[ON UPDATE action]
参考表是父表。而外键的列是父表的主键。
在CREATE语句中引入外键
关于外键约束,我们需要两个表来说明这个概念。让我们首先定义一个表 "设计师",第二个表是 "类别"。这两个表都是通过使用create语句创建的。
>> Create Table designer( designer_id INT GENERATED ALWAYS AS IDENTITY, designer_name VARCHAR(50) NOT NULL, PRIMARY KEY(designer_id));
在表 "designer "中,designer_id被设置为一个主键。现在创建第二个表。
>> create table category(category_id INT GENERATED ALWAYS AS IDENTITY, designer_id INT, category_id INT, category_name VARCHAR(200) NOT NULL, PRIMARY KEY(category_id), CONSTRAINT fk_designer FOREIGN KEY(designer_id) REFERENCES designer(designer_id))<strong>;</strong>
在这个表中,category_id被设置为一个主键。因为这两个表都要用外键约束来连接。我们让 "designer_id "成为这个表中的外键。表中提到了参考表,这样就可以通过搜索表来轻松执行查询。
CONSTRAINT fk_designer
FOREIGN KEY(designer_id)
REFERENCES designer(designer_id));
设计师表是父表,而 "类别 "表是子表。每个设计师负责0个或多个服装类别,每个服装类别有一个或多个设计师考虑。
注意: 要使一个表的id在第二个表中成为外键,重要的是要使这个特定的id在其表中成为PRIMARY KEY。否则,它将不会在另一个表中形成外键。在创建外键的时候会发生错误。
无行动
创建完表后,我们用 "插入 "命令在其中输入数值。
>> insert into designer(designer_name) VALUES (‘Ahmad shah’), (‘Sajjad hassan’);
类似地,在第二个表的情况下,输入值。
>> insert into category(designer_id, category_name) VALUES (1, ‘frock’), (1, ‘frock’), (2, ‘suit’),(2, ‘suit-1’);
在 "类别 "表中,值将被插入两列,包括category_name和designer_id。我们在这里为id添加了相同的数字,为category_name添加了相同的名字以满足条件。现在应用删除命令来证明外键的 "无动作 "类型。在这个命令中,我们提供了一个id号来从表中删除特定的行。
>> DELETE FROM designer WHERE designer_id = 1;
这个查询将不会成功执行。它将显示一个错误信息,如上面提到的snap中显示的那样。这个错误是由于 "NO DELETE NO ACTION"。Postgresql显示违反了约束条件,因为designer_id = 1是针对目前在表中存在的两条记录。
设置NULL作为DELETE子句的选项
创建一个名为 "employee "的表,将emp_id作为PRIMARY KEY。
>> CREATE TABLE employee ( emo_id GENERATED ALWAYS AS IDENTITY, emp_name VARCHAR(50) NOT NULL, PRIMARY KEY(emp_id) );
当我们执行该查询时,会显示一条信息,表明我们的查询已经成功执行。在创建完employee表之后,通过使用 "emp_id "作为外键创建其子表 "info"。
>> create table info (info_id INT GENERATED ALWAYS AS IDENTITY, info_id INT, emp_id INT, info_name VARCHAR(200) NOT NULL, PRIMARY KEY(info_id), CONSTRAINT fk_employee FOREIGN KEY(emp_id) REFERENCES employee(emp_id) ON DELETE SET NULL);
执行该查询,你会看到表被创建。就像之前使用的 "创建 "表语句一样,这也是一样的。这里我们添加了属性。
"on delete set null"。这个动作被应用在ON DELETE子句中。现在,我们必须用这些值来填充表。
>> insert into employee (emp_name) Values (‘sophia smith’), ( ‘rubi williams’), (‘victoria gomex’);
>> insert into info (emp_id, info_name) VALUES ( 1, ‘clerk’), (1, ‘manager’), (2, ‘manager’), (3, ‘clerk’);
删除命令由 "where "子句组成,用来确定表employee中要删除的行的id。
>> DELETE FROM employee WHERE emp_id =2;
在执行查询的时候,相关的数据将被删除。我们将看到该查询后留下的结果表。
>> select * from info;
在子表'info'中具有特定引用的行被设置为NULL,因为我们在创建表时在命令中使用了ON DELETE SET NULL操作。
使用ALTER表命令
在前面的例子中,我们已经看到了如何在创建表的时候应用约束。如果你已经创建了带有FK(外键)约束的表,后来你想添加约束怎么办?下面是这个问题的解决方案。首先,我们将创建两个表。但是在创建表的时候,不需要在第二个表中确定外键,使其成为一个子表。
>> create table nurse ( nurse_id int NOT NULL, nurse_name VARCHAR(55) NOT NULL, nurse_location VARCHAR (55) NOT NULL, PRIMARY KEY (nurse_ID) );
>> create table clinic clinic_id INT, nurse_id INT, clinic_details varchar(50) NOT NULL, clinic_type varchar(50) Not null);
这个表不包含外键约束和引用,等等。插入后,我们现在将通过允许约束条件来更新该表。
>> ALTER TABLE clinic ADD CONSTRAINT fk_nurse FOREIGN KEY (clinic_Id) REFERENCES nurse (nurse_ID) ON DELETE CASCADE ON UPDATE RESTRICT;
改动后的表将拥有外键。
从表中删除约束
为了这个目的,我们使用ALTER命令。这个命令将只删除表的约束。
这对于删除整个表来说是必要的。但是,要删除或放弃这样一个以外键形式与其他表连接的表是不可能的。因此,首先,我们从第二个表中删除第一个创建的表的fk_约束。考虑表 "designer "和子表 "category"。
>> Alter table category DROP CONSTRAINT fk_designer;
在看到查询被执行后。现在应用删除命令。
>> Drop table if exists designer;
图中表示了表内的外键。从ERD表示法中,我们拍了一张快照来澄清关于图像中的约束的模糊性;你可以看到我们在这篇文章中创建的表的连接。
结论
"外键postgresql "显示了两个表之间的连接关系。通过引起另一个表的变化来获取一个表的记录,只能通过这个约束条件来完成。父-子关系是内置的共享键。这个键可以在创建或更新表中引入。这两种方法在本指南中都有解释。这些例子描述了键在任何数据库中使用的所有表中的重要性。