Php Adminer等人如何知道要更新什么?

Php Adminer等人如何知道要更新什么?,php,pdo,mariadb,adminer,Php,Pdo,Mariadb,Adminer,这就是我想要理解的。我有下面的数据库表 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

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

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 on error。但是,行编辑中不存在该选项,因为管理员会主动阻止您进行无效编辑(例如,在整数列中键入字符)

我能想到的唯一方法是在语句末尾标记一个
LIMIT 1
,这可能会起作用。但是,在一个字段数较多的表中,当该行只有一两个字段发生了更改时,需要插入一个非常长的WHERE子句,以帮助MySQL确定要更改的行。

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

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



我应该提到的是,虽然这个问题谈到MySQL,但事实上我使用的是MariaDB 10。

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

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


没有一种唯一的方法来引用每一个单独的行(如果主键没有空值),你实际上是在打破规则#2。由于“完美”关系数据库在日常使用中大多是理论性的和不切实际的,DBs可以在没有严格遵从性的情况下快乐地生存,但在这种情况下,如果没有唯一的密钥,你只会让自己的生活变得艰难。

我不理解你写的一些东西。你编辑了row 2,但您将其编辑为与原来相同的值。您的
更新
查询引用名为
a
b
的列,但这些列是
Field0
Field1
等。大多数用于编辑MySQL表的工具都要求表具有唯一的ID列。您的sql完全错误。您正在使用f进行筛选雅思
a
b
,但这些字段在您的表格中不存在。@MarcB我就是这么问的about@Barmar当我撰写此问题时,
a
b
是打字错误。现在更正。b.t.w.管理员很乐意编辑表格,即使没有唯一的列ID。感谢您的回答。但是,您似乎错过了t他谈到了这个问题。我正在尝试设计一个考虑不周的DB模式,并在这里使用它。我只是想了解Adminer是如何处理MariaDB数据库的。