【问题标题】:How do Adminer et al know what to update?Adminer 等人如何知道要更新什么?
【发布时间】:2015-08-18 06:28:51
【问题描述】:

这是我想要理解的。我有以下数据库表

DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `Field0` int(11) NOT NULL,
  `Field1` int(11) NOT NULL,
  `Field2` enum('a','b','c') COLLATE latin2_czech_cs NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin2 COLLATE=latin2_czech_cs;

INSERT INTO `test` (`Field0`, `Field1`, `Field2`) VALUES
(10,    11, 'a'),
(10,    13, 'b'),
(10,    13, 'a');

注意没有任何索引,唯一键...。在有人告诉我“这不是一个好主意”之前,我有充分的理由将这个例子串在一起。

现在假设我使用 Adminer(您可以轻松阅读 phpMyAdmin 等)来编辑第 2 行

(10,13,b)

现在在编辑之后,如果发出的 SQL 是

UPDATE `test` SET Field2 = 'c' WHERE Field0 = '10' AND Field1 = '13';

MySQL 会更新 两行 并且表格会读取

(10,11,a)
(10,13,c)
(10,13,c)

这不是想要的结果,也不是管理员所做的。它似乎知道要更新哪一行并且就是这样做的。我不清楚这是如何完成的。与许多其他陈述 - 例如CREATE TABLE 可以故意使用无效分配(例如,尝试为 TEXT 字段分配长度,然后在错误时研究 SQL。但是,该选项在行编辑中不存在,因为管理员主动阻止您这样做无效的编辑(例如在整数列中输入字符)。

关于我能想到的唯一方法是在语句末尾标记LIMIT 1 - 这有点工作。但是,在具有大量字段的表中,当该行中只有一个或两个字段发生更改时,将涉及放入一个非常冗长的 WHERE 子句,以帮助 MySQL 识别要更改的 right 行.

也许还有其他技术可以做到这一点,但我不知道这些技术不是很粗糙?我将非常感谢任何可能提供帮助的人。

要完成这篇文章 - 请不要告诉我行应该是唯一的,我应该使用索引。我很清楚这一点。这只是我试图解决的最坏情况。


我应该提一下,虽然这个问题谈到了 MySQL,但我实际上正在使用 MariaDB 10。

【问题讨论】:

  • 我不明白你写的一些东西。您编辑了第 2 行,但将其编辑为与原来相同的值。您的UPDATE 查询引用了名为ab 的列,但这些列是Field0Field1 等。
  • 大多数编辑 MySQL 表的工具都要求该表具有唯一的 ID 列。
  • 您的 sql 完全错误。您正在过滤字段 ab,但这些字段在您的表中不存在。
  • @MarcB 这就是我问的问题
  • @Barmar ab 在我撰写此问题时是拼写错误。现已更正。顺便提一句。即使没有唯一的列 ID,管理员也很乐意编辑表格。

标签: php pdo mariadb adminer


【解决方案1】:

您已要求更新一行,但没有可以使用的唯一标识符,因此,该软件获取了与更新数据库一样多的常量数据。该数据,Field0Field1 的值不是唯一的,因此它更改了它匹配的所有行。如果 (Field0, Field1) 是唯一键,或者存在(唯一)主键,它可能只更改了一行。

如果 (Field0, Field1) 不是唯一的,并且您添加了 LIMIT 1,它仍然可以选择更改匹配的 other 行。

如果没有一种独特的方式来引用每个单独的行(那就是使用没有 NULL 的主键),您实际上违反了Codd's 12 rules,尤其是规则 #2。由于“完美”的关系数据库大多是理论上的,不适合日常使用,因此 DB 可以在没有严格合规的情况下愉快地存在,但在这种情况下,如果没有唯一的密钥,你只会让自己的生活变得艰难。

【讨论】:

  • 感谢您的回答。但是,您似乎错过了问题的重点。我正在尝试在这里设计和使用经过深思熟虑的数据库模式。我只是想了解 Adminer 是如何管理 MariaDB 数据库的。
猜你喜欢
  • 1970-01-01
  • 2018-02-04
  • 2015-07-03
  • 2021-12-14
  • 2018-07-02
  • 1970-01-01
  • 2020-08-04
  • 2018-05-05
  • 2017-04-05
相关资源
最近更新 更多