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;
输出: