首先,我是一个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行的值计数不匹配
我该如何解决这个问题?感谢您的帮助。
答案 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'
所以你需要问的下一个问题是,我想从哪个行中选择行?或者重要吗?