📜  MySQL |有外键时删除行

📅  最后修改于: 2022-05-13 01:55:20.494000             🧑  作者: Mango

MySQL |有外键时删除行

在本文中,让我们讨论 SQL 中外键的概述,主要关注如何在 MySQL 中删除外键。让我们一步一步地讨论它。

外键:
在外键中,当一个表中的非主键属性引用另一个表中的主键相同的属性时,非主键称为外键。我们使用外键引用来建立表和任何表中执行的任何操作之间的链接。

MySQL有外键时删除行的步骤
在这里,我们将通过示例讨论在 MySQL 中有外键时实现删除行所需的步骤,以便更好地理解。

步骤 1:创建数据库
使用以下 SQL 查询创建数据库学生,如下所示。

CREATE DATABASE student;

输出 :



步骤 2:使用数据库
使用数据库 student 使用以下 SQL 查询如下。

USE student;

输出 :

步骤 3:创建两个表:
表 1 –使用以下 SQL 查询创建一个包含 3 列的表 student_details,如下所示。

CREATE TABLE student_details
(
     student_id INT PRIMARY KEY,
     Student_name varchar(8),
     student_year varchar(8)
);

输出 :

表 2 –使用以下 SQL 查询创建一个包含 3 列的表 student_exam,如下所示。



CREATE TABLE student_exam
(
  exam_id INT PRIMARY KEY,
  exam_name varchar(8),
  student_id INT,
  FOREIGN KEY(student_id) 
  REFERENCES student_details(student_id) 
  ON DELETE CASCADE
);

输出 :
表 student_exam 有外键 student_id 引用 student_details 表中的 student_id。在这里,添加 ON DELETE CASCADE是因为当在一个表中删除任何行时,在引用该表中的主键的外部引用表中也会删除相同的行。

步骤 4:验证数据库
要查看数据库中表的描述,请使用以下 SQL 查询,如下所示。

DESCRIBE student_details;

输出 :

DESCRIBE student_exam;

输出 :
在这里,我们可以在 key 列中看到外键的 MUL。

步骤 5:将数据插入表中
使用以下 SQL 查询将行插入 student_details 表中,如下所示。

INSERT INTO student_details VALUES(19102047,'PRADEEP','1st');
INSERT INTO student_details VALUES(19102048,'KOUSHIK','1st');
INSERT INTO student_details VALUES(19102049,'SATWIK','2st');
INSERT INTO student_details VALUES(19102050,'VAMSI','2nd');

输出 :



使用以下 SQL 查询将行插入 student_exam 表中,如下所示。

INSERT INTO student_exam VALUES(9001,'DBMS','19102047');
INSERT INTO student_exam VALUES(9002,'C.N','19102048');
INSERT INTO student_exam VALUES(9003,'O.S','19102049');
INSERT INTO student_exam VALUES(9004,'O.S','19102050');

输出 :

步骤 6:验证插入的数据:
插入行后使用以下 SQL 查询查看表 student_details,如下所示。

SELECT * FROM student_details;

输出 :

插入行后使用以下 SQL 查询查看表 student_exam,如下所示。

SELECT* FROM student_exam;

输出 :

笔记 -
如果未使用 ON DELETE CASCADE 约束,则会发生引用错误。



步骤 7:当有外键时删除行:
查询以从 student_exam 表中删除 ID 为 19102048 的学生,其中引用的表是 student_details。
句法 -

DELETE FROM table_name
 WHERE constraint;

询问 -

DELETE FROM student_details
 WHERE student_id=19102048;

输出:删除前 –

输出:删除后 -
学生 ID 为 19102048 的行在两个表中都被删除。