SQL外键

时间:2020-02-23 14:32:27  来源:igfitidea点击:

设计数据库表时,重要的因素是确保该表具有足够的可伸缩性并同时进行规范化。
为了确保表之间的链接和规范化,我们使用SQL外键。

SQL外键

外键由与另一个表的列匹配的列定义。
外键约束用于确保保持数据引用完整性。

在本教程中,我们将尝试理解以下主题。

  • 创建外键
  • 添加外键
  • 删除外键

1.创建一个外键

下面提到的语法将有助于理解如何在子表中创建外键。
子表是从父表定义外键的表。

语法:

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

请在下面找到上述语法的详细信息,

约束:–此关键字允许为外键约束指定名称。

外键:–此关键字指定子表中引用父表主键的列。

参考:-它指定父表及其用作外键的列。

删除时:-删除时指定将在删除父表的一行时执行的操作。

更新时:–更新时指定将在更新父表的一行时执行的操作。

我们将使用以下内容创建一个新表

CREATE TABLE school(
sch_id int not null auto_increment primary key,
sch_name varchar(255) not null,
sch_description text
) ;

CREATE TABLE student(
std_id int not null auto_increment primary key,
std_name varchar(355) not null,
std_class varchar(355) not null,
sch_id int not null,
FOREIGN KEY fk_sch(sch_id)
REFERENCES school(sch_id)
ON UPDATE CASCADE
ON DELETE RESTRICT
);

使用上面的查询,我们将创建两个表School和Student。
School是Student表的父表,并且具有相同的外键引用。

执行完上面的查询后,以下将是Student表的属性。

2.添加外键

下面提到的语法将有助于理解如何在子表中添加外键。
使用Alter关键字,我们可以将外键添加到现有表中。

语法:

ALTER table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

我们将尝试将新的外键添加到在上一个示例中创建的Student表中。

CREATE TABLE class(
cls_id int not null auto_increment primary key,
cls_name varchar(255)
);

ALTER TABLE student
ADD COLUMN cls_id int not null;
ALTER TABLE student
Add FOREIGN KEY fk_cls(cls_id)
REFERENCES class(cls_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

使用上面的查询,我们将创建一个新的表Class并将一个外键添加到Student表中

执行完上面的查询后,以下将是Student表的属性。

3.删除外键

下面提到的语法将有助于理解如何在子表中删除外键。
使用Alter关键字,我们可以将外键拖放到现有表中。

语法:

ALTER table_name
<span class="crayon-st">DROP <span class="crayon-st">FOREIGN KEY constraint_name;

我们将尝试从上一个示例中创建的Student表中删除外键。

ALTER TABLE student
DROP FOREIGN KEY fk_cls;

使用上面的查询,我们将删除学生表的外键

执行完上面的查询后,以下将是Student表的属性。

删除级联中的外键如何工作?

我们可以使用以下查询为外键约束设置" ON DELETE CASCADE"选项。
在这种情况下,如果删除父表中的相应行,则子表中的行也将被删除。

让我们将其添加到学生表中。

ALTER TABLE student Add FOREIGN KEY fk_sch(sch_id) REFERENCES school(sch_id) ON DELETE CASCADE;

我们将运行以下命令将数据插入School表。

学校表:

INSERT INTO `test`.`school`
(
`sch_name`,
`sch_description`)
VALUES("TestSchool1","School for test 1"),("TestSchool2","School for test 2"),("TestSchool3","School for test 3");

学生桌:

INSERT INTO `test`.`student`
(
`std_name`,
`std_class`,
`sch_id`,
`cls_id`)
VALUES("Student 1","Class 1",1,1),("Student 2","Class 1",2,1)("Student 3","Class 1",1,1),("Student 4","Class 1",1,1),("Student 5","Class 1",3,1),("Student 6","Class 1",3,1);

现在,我们将尝试使用以下命令从子表中删除一行。

DELETE FROM `test`.`student`
WHERE sch_id = 2

这只会从sch_id = 2的子表中删除该条目,而父表将保持不变。

删除后的学生表

现在,我们将尝试从父表中删除一个条目,我们将在子表中看到相同的更改。

我们将执行以下命令从父表中删除行。

DELETE FROM `test`.`school`
WHERE sch_id=3;

以下是父表的delete命令执行后的结果。
子表中的行也将被删除。