我正在尝试合并2个相同的mysql表。一个称为kpi_table,另一个称为stage_kpi_table。两者都是聚合表,但是stage_kpi_table是具有我需要添加到kpi_table的最新信息的表。这是我每天用来更新kpis的一种方法。
问题是运行更新时出现以下错误:
SQL Error [1136] [21S01]: Column count doesn't match value count at row 1
我发现了很多线程并阅读了文档。但是我看不到我在做什么错。 我正在使用pandas(在python 3.7中)to_sql创建表
这是我在python中创建表的方式:
kpi_df.to_sql('kpi_table', con=mysql_conn)
这是两个表的结构
CREATE TABLE `kpi_table` (
`index` bigint(20) DEFAULT NULL,
`date` datetime NOT NULL,
`total_users` bigint(20) DEFAULT NULL,
`concurrent` bigint(20) DEFAULT NULL,
`new_users` double DEFAULT NULL,
`_1dayActive` bigint(20) DEFAULT NULL,
PRIMARY KEY (`date`),
KEY `ix_kpi_table_index` (`index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
如您所见,我将“日期”字段设置为主键 这是我的数据示例
Out[272]:
date total_users concurrent new_users _1dayActive
0 2019-06-12 5 2 5.0 5
1 2019-06-13 8 3 3.0 7
2 2019-06-14 13 3 5.0 10
3 2019-06-15 13 2 0.0 6
4 2019-06-16 13 2 0.0 6
...
这是给出错误的查询(我正在mysql编辑器DBeaver上直接对其进行测试:
INSERT INTO kpi_table (`date`, `total_users`, `concurrent`, `new_users`, `_1dayActive`)
(SELECT * FROM stage_kpi_table as skpi)
ON DUPLICATE KEY UPDATE total_users = (skpi.total_users);
我希望根据'date'字段将kpi_table与其他表一起更新。如果日期存在,请更新值(在此示例中为'total_users'),否则请插入新行。
我敢肯定这一定是愚蠢的,但我一直无法弄清楚。 非常感谢!! 劳尔。
答案 0 :(得分:1)
INSERT INTO kpi_table ('date', 'total_users', 'concurrent', 'new_users', '_1dayActive')
(SELECT 'date', 'total_users', 'concurrent', 'new_users', '_1dayActive' FROM stage_kpi_table as skpi)
ON DUPLICATE KEY UPDATE total_users = (skpi.'total_users');