MySQL:UPDATing没有保证唯一字段的行

时间:2010-06-25 21:08:18

标签: php sql mysql database-design

我正在使用一个旧的MySQL表,它可以作为各种日志。它看起来像

CREATE TABLE `queries` (
  `Email` char(32) NOT NULL DEFAULT '',
  `Query` blob,
  `NumRecords` int(5) unsigned DEFAULT NULL,
  `Date` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

现在,我需要能够UPDATE此表中的记录(不要问为什么,我不知道)。通常,我会做

UPDATE table SET ... WHERE unique_column = value

但在这种情况下,我没有可以使用的唯一专栏。

是否有针对此的解决方法,或者我只是需要推出一个不错的标准INT NOT NULL AUTO_INCREMENT

5 个答案:

答案 0 :(得分:3)

UPDATE queries 
SET ... 
WHERE Email = value1 
  AND Query = value2 
  AND NumRecords = value3 
  AND Date = value4 
LIMIT 1;

答案 1 :(得分:2)

唯一标识符是执行此操作的唯一可靠方式。只需添加auto_increment列即可完成。

有关详尽的信息,包括一些变通方法(虽然它们都不完美!)检查this question,其中OP有一个没有唯一标识符的表,无法更改它。

更新:正如Doug Currie指出的那样,这并不完全正确:这里不需要唯一的ID。我仍然强烈建议总是使用一个。如果两个用户决定在同一时间更新彼此完全重复的两个不同的行(例如,通过在GUI中选择一行),则可能存在冲突,因为不可能定义哪个行是哪个行的目标。这是一个微观的可能性,在手边的情况下可能完全可以忽略不计,但它并不是一个好的设计。

答案 2 :(得分:0)

如果您不知道这一点,它将影响性能,但在更新记录时不需要在WHERE子句中使用主键。您可以通过指定现有值来单独输出一行:

UPDATE queries
SET Query = 'whatever'
WHERE Email = 'whatever@whatever.com' AND
  Query = 'whatever' AND
  NumRecords = 42 AND
  Date = '1969-01-01'

如果有重复的行,为什么不全部更新,因为无论如何都无法区分?

你无法在MySQL查询浏览器中使用GUI界面。

如果你需要开始区分行,那么添加一个自动增量整数字段,你也可以在MySQL Query Browser中编辑它们。

答案 3 :(得分:0)

这里有两个不同的问题。首先,正在重复删除表格。这是一个完全不同的问题和解决方案,可能涉及添加auto_increment列。但是,如果您不打算对表进行重复数据删除,那么根据定义,具有相同数据的两行代表相同的信息实例,如果它们与过滤条件匹配,则更新。因此,要么添加唯一键,要对表进行重复数据删除(在这种情况下唯一性基于所有列的组合),要么更新所有匹配的行。

答案 4 :(得分:0)

首先删除重复项。在表中(或任何表格中)有重复行的重点是什么?

删除重复项后,您可以实现密钥,问题就解决了。