我将在一个大型旧表(数十万行)中创建一个 UNIQUE 键,以强制每行包含唯一数据。我不能只是创建索引,因为该表已经包含一些重复项。我不知道它包含多少重复项,或者是否需要重复项。简而言之,在我想出一个查询来选择所有违反未来唯一键的行之前,我无法分析问题。
假设我有一个包含字段col_one、col_two、col_three和col_four的表。我未来的唯一键将包含col_two和col_three。如何选择表中col_two和col_three在同一个表中有重复的所有行?
我将在一个大型旧表(数十万行)中创建一个 UNIQUE 键,以强制每行包含唯一数据。我不能只是创建索引,因为该表已经包含一些重复项。我不知道它包含多少重复项,或者是否需要重复项。简而言之,在我想出一个查询来选择所有违反未来唯一键的行之前,我无法分析问题。
假设我有一个包含字段col_one、col_two、col_three和col_four的表。我未来的唯一键将包含col_two和col_three。如何选择表中col_two和col_three在同一个表中有重复的所有行?
使用一个组。
SELECT 
  col_two,
  col_three,
  COUNT (*) AS `num_dupes`
FROM
  your_table
GROUP BY
  col_two,
  col_three
HAVING 
  COUNT(*) > 1 -- Only return results where there is at least one duplicate.
如果要查看表中存在重复项的所有结果,只需将这些结果连接到表中即可:
SELECT
  your_table.*
FROM
  your_table
    INNER JOIN 
    (SELECT 
      col_two,
      col_three,
      COUNT (*) AS `num_dupes`
    FROM
      your_table
    GROUP BY
      col_two,
      col_three
    HAVING 
      COUNT(*) > 1) dupes 
      ON your_table.col_two = dupes.col_two AND
         your_table.col_three = dupes.col_three