运行INSERT时出错...重复键更新

时间:2019-08-21 09:47:05

标签: python mysql pandas

我正在尝试合并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'),否则请插入新行。

我敢肯定这一定是愚蠢的,但我一直无法弄清楚。 非常感谢!! 劳尔。

1 个答案:

答案 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');