📜  SQL 查询演示表中参照完整性中的删除异常

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

SQL 查询演示表中参照完整性中的删除异常

在 SQL 中,存在引用完整性的概念。这意味着外键可以引用另一个表的主键。这个概念基本上存在3个异常。在这里,我们讨论删除异常。这意味着如果目标表的外键列中存在条目,则不能从基表的主键列中删除该条目。如下图所示。对于本文,我们将使用 Microsoft SQL Server 作为我们的数据库。

第 1 步:创建数据库。为此,请使用以下命令创建一个名为 GeeksForGeeks 的数据库。

询问:

CREATE DATABASE GeeksForGeeks

输出:

第 2 步:使用 GeeksForGeeks 数据库。为此,请使用以下命令。

询问:

USE GeeksForGeeks

输出:

第 3 步:在 GeeksForGeeks 数据库中创建一个表 STUDENT_INFO。该表有 3 列,即 ROLL_NO、STUDENT_NAME 和 BRANCH,其中包含各个学生的卷号、姓名和分支。

询问:

CREATE TABLE STUDENT_INFO(
ROLL_NO INT PRIMARY KEY,
STUDENT_NAME VARCHAR(10),
BRANCH VARCHAR(5)
);

输出:

第 4 步:描述表 STUDENT_INFO 的结构。

询问:

EXEC SP_COLUMNS STUDENT_INFO;

输出:

第 5 步:在 GeeksForGeeks 数据库中创建一个表 STUDENT_MARKS。该表有 3 列,即 ROLL_NO、SUBJECT 和 MARKS,分别包含各个学生的卷号、科目和分数。这里 ROLL_NO 列作为外键引用 STUDENT_INFO 表的 ROLL_NO 列,这是 STUDENT_INFO 表的主键。

询问:

CREATE TABLE STUDENT_MARKS(
ROLL_NO INT REFERENCES STUDENT_INFO(ROLL_NO),
SUNJECT VARCHAR(10),
MARKS INT
);

输出:

第 6 步:描述表 STUDENT_MARKS 的结构。

询问:

EXEC SP_COLUMNS STUDENT_MARKS;

输出:

第 7 步:在 STUDENT_INFO 表中插入 3 行。

询问:

INSERT INTO STUDENT_INFO VALUES(1,'JIM','CSE');
INSERT INTO STUDENT_INFO VALUES(2,'TIM','ELE');
INSERT INTO STUDENT_INFO VALUES(3,'PAM','ECE');

输出:

第 8 步:显示 STUDENT_INFO 表的所有行。

询问:

SELECT * FROM STUDENT_INFO;

输出:

第 9 步:在 STUDENT_MARKS 表中插入 2 行。

询问:

INSERT INTO STUDENT_MARKS VALUES(1,'CPP',98);
INSERT INTO STUDENT_MARKS VALUES(2,'DBMS',89);

输出:

第 10 步:显示 STUDENT_MARKS 表的所有行。

询问:

SELECT * FROM STUDENT_MARKS;

输出:

步骤 11:从 STUDENT_INFO 表中删除 ROLL_NO 为 3 的 1 行。此处 ROLL_NO 列的条目即 3 在目标表即 STUDENT_MARKS 中不存在。

询问:

DELETE FROM STUDENT_INFO WHERE ROLL_NO=3;

注意:删除是成功的,因为没有违反删除异常,因为目标表 STUDENT_MARKS 中不存在卷号 3。

输出:

步骤12:从STUDENT_INFO 表中删除ROLL_NO 为1 的1 行。此处ROLL_NO 列的条目即1 存在于目标表即STUDENT_MARKS 中。

询问:

DELETE FROM STUDENT_INFO WHERE ROLL_NO=1;

– 由于目标表 STUDENT_MARKS 中存在卷号 1,因此违反了删除异常,因此删除不成功并引发参照完整性错误。

输出:

第 13 步:从 STUDENT_MARKS 表中删除 ROLL_NO 为1的 1 行。

询问:

DELETE FROM STUDENT_INFO WHERE ROLL_NO=1;

输出:

步骤 14:从 STUDENT_INFO 表中删除 ROLL_NO 为 1 的 1 行。此处 ROLL_NO 列的条目即 1 在目标表即 STUDENT_MARKS 中不存在。

询问:

DELETE FROM STUDENT_INFO WHERE ROLL_NO=1;

– 删除是成功的,因为没有违反删除异常,因为目标表 STUDENT_MARKS 中不存在卷号 1。

输出:

第 15 步:显示 STUDENT_INFO 表的所有最后一行。

询问:

SELECT * FROM STUDENT_INFO;

输出:

第 16 步:显示 STUDENT_MARKS 表的所有最后一行。

询问:

SELECT * FROM STUDENT_MARKS;

输出: