首先需要说明的是,本文是在RDBMS为SQL Server的前提下进行探讨的,其他RDBMS具体情况不清楚,大家根据自身情况选择性阅读~
问题来源:
在学习UPDATE关键字修改数据的时候,有一条是主码不允许修改,带着好奇心,进行了测试👀
实验过程:
本实验采用了Student和SC两个表,如下图:
说明一下,这两个表的关系是:SC表的Sno为主码,参照引用自Student表的主码,所以两表间以Sno为桥梁具有参考完整性,同时可能破坏参照完整性的情况和违约处理如下表:
🌟第一次尝试:SC表中学号为15121的学生李勇的记录比较多,先来试试改他的学号:
UPDATE StudentSET Sno = 15222WHERE Sname = '李勇';
修改失败,与SC表中的Sno的外码约束相冲突,修改之后会破坏其参照完整性,所以遭到了DBMS的拒绝。
🌟第二次尝试:刚刚的李勇同学在两张表里都有记录,那是不是找一个只在Student表里有记录,在SC表里没有的就能修改呢?
带着疑问,我尝试了学号为15172的陈秋同学:
UPDATE StudentSET Sno = 15222WHERE Sname = '陈秋';
我靠!成功了!!!为了避免偶然性或者其他什么原因,我又尝试了其他只在Student表内有记录,在SC表内没有的学生进行了测试:
UPDATE StudentSET Sno = 15333WHERE Sname = '欧阳'; UPDATE StudentSET Sno = 15777WHERE Sname = '欧阳na'; SELECT * FROM Student
😁可见这个想法是可行的,因此得出以下结论:
— — — — — — — — — — — — — — — — — — — — — — — — — — — —
在不破坏参照完整性的条件下,即修改在被参照表中有但是参照表中没有的数据是不会破坏参照完整性的,是可以修改主码的。
但是,同时需要注意:主码是不能重复的,也不可为空(NULL)!!所以修改后的值不能是已经存在的值或NULL。当然,主码一般条件下是不去修改的,本文只是在SQL Server关系数据库管理系统中为了满足好奇心进行的探讨~
— — — — — — — — — — — — — — — — — — — — — — — — — — — —
感谢阅读~😊,本文问题来源 源自我的一篇博客:SQL Server 数据库基本操作入门篇【7】