转载: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 警告你,因为当更新没有主键的表,你可能会得到意外的结果。请看下面的例子。
以下面的表为例:
| Name | Surname | Age |
|---|---|---|
| Pete | McKensey | 24 |
| John | Slaid | 34 |
| Pete | McKensey | 44 |
| Mary | Joplen | 26 |
这表没有主键。如果你更新 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;
这些语句是不会造成任何不一致的数据。
我們收到许多查询关于这一点,所以决定任何表必须可更新,如果表没有主键,只是显示一个警告。
本文探讨了在没有主键的情况下更新数据库表可能引发的数据不一致性问题。通过具体实例展示了为何主键对于确保数据完整性至关重要。
295

被折叠的 条评论
为什么被折叠?



