首页 > 解决方案 > 此表不包含唯一列。网格编辑、复选框、编辑、复制和删除功能不可用,2020

问题描述

为什么 phpMyAdmin 在从仅以小写(和下划线)命名且确实具有(单列)主键的表中选择时给我这个警告,并且缺少功能?看到这个后我检查了这些元素

具体来说,我的查询是

SELECT su.* FROM `r8u2d_comps_testsubitem` su 
JOIN `r8u2d_comps_testitem` ti ON ti.id=su.testitemid 
JOIN `r8u2d_comps_test` t ON ti.testid=t.id 
WHERE t.id=241
ORDER BY ti.ordering

别名为“su”的表有一个列“id”(int(11),autoincrement)和一个仅使用该字段的主键。在我看来,这个查询避免了这个答案中列出的所有限制,那么问题是什么?是 phpMyAdmin(我的托管公司有 4.7.9,但我在本地使用 5.0.4 遇到了同样的问题)还是 MySQL(主机有 5.7.29-0ubuntu0.16.04.1 -(Ubuntu),我有 10.4.17-MariaDB - MariaDB 服务器,我想不是严格可比的)。

表结构

`id`            INT NOT     NULL AUTO_INCREMENT, 
`testitemid`    INT NOT     NULL
`marker`        CHAR(20)    NULL
`text`          TEXT        NOT NULL,
`ordering`      TINYINT     NOT NULL,
PRIMARY KEY (`id`),
KEY `testitemid` (`testitemid`),
KEY `ordering` (`ordering`),
CONSTRAINT `subelementToElement` 
    FOREIGN KEY (`testitemid`) REFERENCES `#__comps_testitem`(`id`) 
        ON DELETE CASCADE 
        ON UPDATE NO ACTION

标签: mysqlphpmyadmin

解决方案


phpMyAdmin 努力使用主键/唯一键来启用网格编辑,但是当与多个 JOIN 语句一起使用时,检测逻辑并不能很好地支持。phpMyAdmin 解析器很难通过一些查询向后工作,并确定哪些列来自哪些表以及是否存在可用于编辑数据的主键。我想警告消息最好写成“此表或查询不包含唯一列,或者您的查询是一个连接,它混淆了原始表结构,以至于我们不想冒险损坏您的数据。”

不幸的是,除了有人重写 phpMyAdmin 的这一部分之外,我现在推荐的最佳解决方案是通过 JOIN 查询找到要修改的数据,然后打开该单独的表并滚动浏览视图(或使用搜索查找) 您希望直接从表中修改的行。


推荐阅读