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

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

可应用 Navicat 产品:Navicat for MySQL、Navicat for PostgreSQL、Navicat for Oracle、Navicat for SQL Server、Navicat for SQLite、Navicat for MariaDB、Navicat Premium

可应用 Navicat 版本编号:Windows 版本 10.x 或以下、Mac 版本 8.x 或以上、Linux 版本 10.x 或以下



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

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

macOS 8.x - 11.2:选择 Navicat xxx > 偏好设置,并在网格选项卡取消勾选显示主键警告

macOS 12 或以上:选择 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;

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

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

相关文章

还有其他问题吗?
提交查询