0

我正在尝试从 MySQL 表中删除双联(有时是三联,不幸的是!)。我的问题是唯一可用的唯一数据是主键,所以为了识别双峰,你必须考虑所有的列。

我已经设法识别出所有具有双线的记录,并将它们连同它们的双线(包括它们的主键)复制到表中temp。源表被调用translation,它有一个名为 的整数主键TranslationID。我该如何从这里继续前进?谢谢!

编辑可用的列是:

TranslationID
LanguageID
Translation
Etymology
Type
Source
Comments
WordID
Latest
DateCreated
AuthorID
Gender
Phonetic
NamespaceID
Index
EnforcedOwner

Latest重复问题在于分配了列的行1

编辑#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)
4

4 回答 4

4

您可以在没有临时表或子查询的情况下删除重复项。删除所有具有相同数据但不同的行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-16T14:36:48.320 回答
2

使用当前的 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。

将来您可以将引擎更改为 InnoDB 引擎,如下所示:

ALTER TABLE table_name ENGINE=InnoDB;

然后将Unique约束添加到 TranslationID 字段。

于 2012-04-16T14:39:05.743 回答
0

我不会识别不唯一的行,而是尝试将有效数据复制到新表中,然后删除旧表并用这个新的、清理过的表替换它。

我可以看到两种方式:

  • 在 SQL 查询中使用DISTINCT关键字();
  • GROUP BY对所有列(source)使用语句。
于 2012-04-16T14:38:31.423 回答
0

如果除了主键之外双/三是相同的,那么您可以从 temp 中选择所有与另一个相同的记录,除了具有比另一个更大的主键;这将为您提供带有每个双联/三联的最小键的记录。然后,您可以从翻译中删除这些记录。

于 2012-04-16T14:35:14.493 回答