我正在使用一个旧的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
?
答案 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)
首先删除重复项。在表中(或任何表格中)有重复行的重点是什么?
删除重复项后,您可以实现密钥,问题就解决了。