【发布时间】: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查询引用了名为a和b的列,但这些列是Field0、Field1等。 -
大多数编辑 MySQL 表的工具都要求该表具有唯一的 ID 列。
-
您的 sql 完全错误。您正在过滤字段
a和b,但这些字段在您的表中不存在。 -
@MarcB 这就是我问的问题
-
@Barmar
a和b在我撰写此问题时是拼写错误。现已更正。顺便提一句。即使没有唯一的列 ID,管理员也很乐意编辑表格。