试图通过扭曲删除MySQL数据库中的重复条目

时间:2014-10-14 23:07:45

标签: mysql

首先,我是一个nooob。我有一个包含大量重复行的数据库表。我创建了一个新的干净数据库表(ufx_multicity),并在MySQL中尝试了以下命令来复制旧数据库表(ufx_multicity2)中的所有行,并忽略重复的条目。

INSERT INTO ufx_multicity 
            (`country_id`, 
             `zones_id`, 
             `cityname`, 
             `city_slug`, 
             `lat`, 
             `lng`, 
             `scall_factor`, 
             `is_zoom_home`, 
             `map_type`, 
             `post_type`, 
             `categories`, 
             `is_default`, 
             `message`, 
             `color`, 
             `images`, 
             `header_color`, 
             `header_image`, 
             `cat_scall_factor`, 
             `is_zoom_cat`) 
SELECT DISTINCT `cityname`, 
                `city_slug`, 
                `lat`, 
                `lng` 
FROM   ufx_multicity2; 

我收到以下错误:

  

1136 - 列数与第1行的值计数不匹配

我该如何解决这个问题?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您正尝试插入19列:

INSERT INTO ufx_multicity (country_id, zones_id, cityname, city_slug, lat, lng, scall_factor, is_zoom_home, map_type, post_type, categories, is_default, message, color, images, header_color, header_image, cat_scall_factor, is_zoom_cat)

仅来自4列的数据

SELECT DISTINCT cityname, city_slug, lat, lng FROM ufx_multicity2;

两者必须匹配,以便将4列插入4列:

 INSERT INTO ufx_multicity (cityname, city_slug, lat, lng) SELECT DISTINCT cityname, city_slug, lat, lng FROM ufx_multicity2;

答案 1 :(得分:0)

  

列数与值计数

不匹配

此错误消息是否具有描述性?

您的INSERT正在命名19个列,希望您为其提供数据。

但是SELECT只列出了四列。 INSERT如何知道将19个列中的哪四列放入数据中?它应该用于其他十五列的值?

列数必须相同,且顺序相同。可以在INSERT中为较少的列命名,也可以在SELECT中提供更多列。


重新提出有关重复的问题:

您可能会误解SELECT DISTINCT的工作原理。这意味着如果行中的任何列与另一行中的列不同,则行计为不同。并且DISTINCT始终适用于此决定中包含所有列的选择列表。

您可以尝试使用GROUP BY代替DISTINCT

INSERT INTO wfx_multicity (country_id, zones_id, cityname, 
  city_slug, lat, lng, 
  scall_factor, is_zoom_home, map_type, post_type, categories, 
  is_default, message, color, images, header_color) 
SELECT MAX(country_id), MAX(zones_id), cityname, city_slug, lat, lng, 
  MAX(scall_factor), MAX(is_zoom_home), MAX(map_type), MAX(post_type), MAX(categories),
  MAX(is_default), MAX(message), MAX(color), MAX(images), MAX(header_color) 
FROM wfx_multicity2
GROUP BY cityname, city_slug, lat, lng;

GROUP BY的工作方式不同。对于SELECT中指定的列的每个不同组合,它会将GROUP BY的结果减少到一行。这使您有机会选择列的子集,将行减少到那些具有不同值的行,而不仅仅是那几列。

注意我将分组函数MAX()放在每个其他列周围。如果不这样做,MySQL会从每个组中的行中任意选择这些列的值。

考虑下表:

col1 col2 col3
---- ---- ----
1    14    'X'
1    12    'Z'
1    14    'Y'
2    27    'K'
2    9     'K'
3    6     'Q'

如果我从这个表中查询如下:

SELECT col1, col2, col3 FROM mytable GROUP BY col1;

它应该只返回三行,因为col1中有三个不同的值。但它应该在其他列中返回什么?这是模棱两可的。在实践中,MySQL 可能从每个组的第一行返回值,但不能保证一致地执行此操作。

在严格的SQL中,查询的模糊形式是一个错误(对于它的价值,MySQL 5.7也会使它成为一个错误。)

SELECT col1, MAX(col2), MAX(col3) FROM mytable GROUP BY col1;

使用像MAX()这样的分组函数可以解决歧义,但这会返回每个组中最后一行的所有值吗?不是 - 它返回每列中的最大值,即使这些值来自不同的行。

col1 MAX(col2) MAX(col3)
---- --------- ---------
1    14        'Z' <-- none of the rows has this combination
2    27        'K'
3    6         'Q'

所以你需要问的下一个问题是,我想从哪个行中选择行?或者重要吗?