开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

flink JDBC SQL sink到mysql表Duplicate entry问题

flink JDBC SQL Connector sink到mysql表,mysql表有主键和唯一键,定义sink mysql 表唯一键为主键,任务报Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1711666254861078528-ORDonoff-0' for key 'DEVICEID_DATACODE_DEL'

展开
收起
1731446667249005 2023-11-06 09:42:40 330 0
3 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    当您使用 Flink JDBC Sink 将数据写入 MySQL 数据库时,如果目标表中有主键或唯一键约束,则必须确保写入的数据符合这些约束条件。否则,MySQL 会拒绝插入重复的记录,从而抛出 SQLIntegrityConstraintViolationException 异常。
    为了解决这个问题,您可以采取以下几种措施:

    1. 在写入之前,先判断即将写入的数据是否存在重复记录,如果有则不写入;
    2. 更改数据库表结构,取消主键或唯一键约束;
    3. 在 Flink 中指定冲突策略,例如 updateMode="upsert",这会让 Flink 自动更新已有记录,而不是插入重复记录。
      请注意,更改数据库表结构可能会对现有应用造成影响,所以在做此决定前需要谨慎考虑。而指定冲突策略的方法则更为方便,但也需要注意其中的性能开销和安全性。
    2023-11-06 13:44:54
    赞同 1 展开评论 打赏
  • 你可以查看下你的源表是不是做了truncate操作,cdc并不会同步truncate

    2023-11-06 11:28:18
    赞同 展开评论 打赏
  • 看起来你的问题是由于在尝试将数据写入 MySQL 表时违反了唯一约束而导致的。根据你的描述,在使用 Flink JDBC SQL Connector 将数据 sink 到 MySQL 表中时遇到了一个异常。这个异常是因为试图插入的数据违反了表中的唯一约束,即 PRIMARY KEY 或 UNIQUE 索引。这是因为 MySQL 数据表中已经存在与您要插入的新行具有相同 PRIMARY KEY 或 UNIQUE 索引值的记录,所以无法再添加重复的记录。请检查您的数据源,确保所有新记录都具有唯一的 PRIMARY KEY 或 UNIQUE 索引值。如果你需要更新现有记录,则可以使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句来实现。这将在尝试插入新行时自动检测是否已有与之相同的 PRIMARY KEY 或 UNIQUE 索引值,并相应地执行更新操作而不是插入新行。你可以考虑将 PRIMARY KEY 或 UNIQUE 索引设置为自增模式,以避免出现冲突。这样,每当您向表中插入新行时,MySQL 会自动为其分配一个新的唯一索引值,从而避免违反唯一约束。
    image.png

    2023-11-06 09:57:56
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关产品

  • 实时计算 Flink版
  • 相关电子书

    更多
    One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
    One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
    如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

    相关镜像