flink JDBC SQL sink到mysql表Duplicate entry问题[阿里云实时计算 Flink版]

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

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
=====这是一个广告位,招租中,联系qq 78315851====
2 条回复 A 作者 M 管理员
  1. 当您使用 Flink JDBC Sink 将数据写入 MySQL 数据库时,如果目标表中有主键或唯一键约束,则必须确保写入的数据符合这些约束条件。否则,MySQL 会拒绝插入重复的记录,从而抛出 SQLIntegrityConstraintViolationException 异常。
    为了解决这个问题,您可以采取以下几种措施:

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

  3. 看起来你的问题是由于在尝试将数据写入 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 会自动为其分配一个新的唯一索引值,从而避免违反唯一约束。