数据库优化sql语句数据库SQL语句UPDATE能否修改主码
⾸先需要说明的是,本⽂是在RDBMS为 SQL Server 的前提下进⾏探讨的,其他RDBMS具体情况不清楚,⼤家根据⾃⾝情况选择性阅读~
问题来源:
在学习UPDATE关键字修改数据的时候,有⼀条是主码不允许修改,带着好奇⼼,进⾏了测试
实验过程:
本实验采⽤了Student和SC两个表,如下图:
说明⼀下,这两个表的关系是:SC表的Sno为主码,参照引⽤⾃Student表的主码,所以两表间以Sno为桥梁具有参考完整性,同时可能破坏参照完整性的情况和违约处理如下表:
第⼀次尝试:SC表中学号为201215121的学⽣李勇的记录⽐较多,先来试试改他的学号:
UPDATE Student
SET Sno =201215222
WHERE Sname ='李勇';
修改失败,与SC表中的Sno的外码约束相冲突,修改之后会破坏其参照完整性,所以遭到了DBMS的拒绝。
第⼆次尝试: 刚刚的李勇同学在两张表⾥都有记录,那是不是⼀个只在Student表⾥有记录,在SC表⾥没有的就能修改呢?
带着疑问,我尝试了学号为201215172的陈秋同学:
UPDATE Student
SET Sno =201215222
WHERE Sname ='陈秋';
我靠!成功了为了避免偶然性或者其他什么原因,我⼜尝试了其他只在Student表内有记录,在SC表内没有的学⽣进⾏了测试:
UPDATE Student
SET Sno =201215333
WHERE Sname ='欧阳';
UPDATE Student
SET Sno =201215777
WHERE Sname ='欧阳na';
SELECT*FROM Student
可见这个想法是可⾏的,因此得出以下结论:— — — — — — — — — — — — — — — — — — — — — — — — — — — —
在不破坏参照完整性的条件下,即修改在被参照表中有但是参照表中没有的数据是不会破坏参照完整性的,是可以修改主码的。
但是,同时需要注意:主码是不能重复的,也不可为空(NULL)!!所以修改后的值不能是已经存在
的值或NULL。当然,主码⼀般条件下是不去修改的,本⽂只是在SQL Server关系数据库管理系统中为了满⾜好奇⼼进⾏的探讨~— — — — — — — — — — — — — — — — — — — — — — — — — — — —
感谢阅读~  ,本⽂问题来源 源⾃我的⼀篇博客: