用于演示表中参照完整性中的更新异常的 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 步:在 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');
输出:
第 6 步:显示 STUDENT_INFO 表的所有行。
询问:
SELECT * FROM STUDENT_INFO;
输出:
第 7 步:在 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
);
输出:
第 8 步:描述表 STUDENT_MARKS 的结构。
询问:
EXEC SP_COLUMNS STUDENT_MARKS;
输出:
第 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 设置为 30。此处 ROLL_NO 列的条目即 3 在目标表即 STUDENT_MARKS 中不存在。
询问:
UPDATE STUDENT_INFO SET ROLL_NO=30 WHERE ROLL_NO=3;
注意:更新成功,因为没有违反更新异常,因为目标表 STUDENT_MARKS 中不存在卷号 3。
输出:
第 12 步:显示所有更新的 STUDENT_INFO 表。
询问:
SELECT * FROM STUDENT_INFO;
输出:
步骤 13:更新 STUDENT_INFO 表中 ROLL_NO 为 2 的 1 行并将 ROLL_NO 设置为 20。此处 ROLL_NO 列的条目即 2 存在于目标表即 STUDENT_MARKS 中。
询问:
UPDATE STUDENT_INFO SET ROLL_NO=20 WHERE ROLL_NO=2;
注意:更新不成功,并且由于目标表 STUDENT_MARKS 中存在卷号 2,因此违反了更新异常,因此引发了引用完整性错误。
输出: