关于我的表没有主键,这是什么警告?

本文探讨了在没有主键的情况下更新数据库表可能引发的数据不一致性问题。通过具体实例展示了为何主键对于确保数据完整性至关重要。

转载:http://wiki.navicat.com/zh-chs/index.php/%E5%85%B3%E4%BA%8E%E6%88%91%E7%9A%84%E8%A1%A8%E6%B2%A1%E6%9C%89%E4%B8%BB%E9%94%AE%EF%BC%8C%E8%BF%99%E6%98%AF%E4%BB%80%E4%B9%88%E8%AD%A6%E5%91%8A%EF%BC%9F

可应用操作系统:Windows、Mac、Linux

可应用 Navicat 产品:全部

可应用 Navicat 版本编号:版本 10.x 或以下


首先,如果警告烦扰了你,可以关闭它!

Windows 和 Linux:选择工具 > 选项,并在外观 > 数据 & 网格取消勾选显示主键警告

Mac:选择 Navicat xxx > 偏好设置,并在网格选项卡取消勾选显示主键警告


Navicat 警告你,因为当更新没有主键的表,你可能会得到意外的结果。请看下面的例子。

以下面的表为例:


NameSurnameAge
PeteMcKensey24
JohnSlaid34
PeteMcKensey44
MaryJoplen26


这表没有主键。如果你更新 Pete 的年龄做 44,下面的语句将发送到服务器:


UPDATE "table" SET age=44 WHERE name='Pete' and surname='McKensey' and age=24;

这将正确运行,改变了第一个记录的年龄值。现在将表中有两个 Pete McKensey 年龄 44 的记录。如果你现在尝试更新第三个记录的年龄为 55,下面的语句将发送到服务器:

UPDATE "table" SET age=55 WHERE name='Pete' and surname='McKensey' and age=44; 

本语句将改变第一个和第三个记录的年龄值为 55。


你应该注意到,本表中的数据现在已经成为不一致,第一个和第三个记录有完全相同的值,没有办法区分这两个记录。这是因为表不是第一范式(基于关系数据库的任何书籍将解释这一点),这意味著在表中没有一个栏位或一组栏位用来唯一地识別记录。


这就是为什么以前版本的 Navicat,需要一个主键来更新表。如果这个表有一个 ID 栏位是主键,语句将如下:

UPDATE "table" SET age=44 WHERE ID=1;
UPDATE "table" SET age=55 WHERE ID=3;

这些语句是不会造成任何不一致的数据。


我們收到许多查询关于这一点,所以决定任何表必须可更新,如果表没有主键,只是显示一个警告。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值