我正在尝试删除双打(不幸的是,有时是三重奏!)从一个MySQL表。我的问题是,唯一唯一可用的数据是主键,因此为了识别双列,必须考虑所有列。
我成功地识别了所有有双字节的记录,并将它们连同它们的双字节(包括主键)复制到表temp中。源表名为translation,它有一个名为TranslationID的整数主键。我该怎么从这里继续前进?谢谢!
编辑可用列如下:
TranslationID
LanguageID
Translation
Etymology
Type
Source
Comments
WordID
Latest
DateCreated
AuthorID
Gender
Phonetic
NamespaceID
Index
EnforcedOwner这个问题存在于指定了Latest列的行中,这些行分配了Latest。
编辑#2谢谢大家抽出时间!我通过使用WouterH的答案解决了这个问题,结果产生了以下查询:
DELETE from translation USING translation, translation as translationTemp
WHERE translation.Latest = 1
AND (NOT translation.TranslationID = translationTemp.TranslationID)
AND (translation.LanguageID = translationTemp.LanguageID)
AND (translation.Translation = translationTemp.Translation)
AND (translation.Etymology = translationTemp.Etymology)
AND (translation.Type = translationTemp.Type)
AND (translation.Source = translationTemp.Source)
AND (translation.Comments = translationTemp.Comments)
AND (translation.WordID = translationTemp.WordID)
AND (translation.Latest = translationTemp.Latest)
AND (translation.AuthorID = translationTemp.AuthorID)
AND (translation.NamespaceID = translationTemp.NamespaceID)发布于 2012-04-16 14:36:48
您可以在没有临时表或子查询的情况下删除重复项。删除所有具有相同数据但具有不同TranslationID的行
DELETE from translation USING translation, translation as translationTemp
WHERE (NOT translation.TranslationID = translationTemp.TranslationID)
AND (translation.LanguageID = translationTemp.LanguageID)
AND (translation.Translation = translationTemp.Translation)
AND (translation.Etymology = translationTemp.Etymology)
AND // compare other fields here发布于 2012-04-16 14:39:05
创建一个SELECT语句,将当前SELECT作为子select,这样您就可以返回一个应该删除的ID。然后在DELETE FROM语句中应用该SELECT。
示例(伪代码):
SELECT1 = SELECT ... AS temp; # the table you have right now
SELECT2 = SELECT TranslationID FROM (SELECT1)最后的查询如下所示:
DELETE FROM table_name WHERE TranslationID IN (SELECT2);您只需要在最后的查询中插入带有子SELECT的select。
将来,可以将引擎更改为InnoDB引擎,如下所示:
ALTER TABLE table_name ENGINE=InnoDB;然后向Unique字段添加一个TranslationID约束。
发布于 2012-04-16 14:35:14
如果除了主键之外,双重键/三重键是相同的,那么您可以从temp中选择所有与另一个记录相同的记录,除非有比另一个主键大的主键;这将为您提供临时/记录w/每个双簧管/triplette的最小键。然后,您可以从翻译中删除这些记录。
https://stackoverflow.com/questions/10176014
复制相似问题