报错原文
Execute failed: Duplicate row ID “Row0”
Duplicate key “Row12” detected in row 340
引号里的那个值就是撞车的行 ID,可能是 KNIME 自动生成的 Row0、Row1,也可能是你指定的某个业务编号。iModel 中文界面显示为「行 ID 重复」一类的措辞,以实际界面为准。
一句话原因
KNIME 的每张表都有一列你没建过的行 ID,它不是普通数据列,作用相当于主键。任何往表里塞行的操作,都要保证塞进去之后行 ID 不重复。这条报错就是这道校验没过。
行 ID 和你的业务编号是两码事。资产编号、工号、订单号都是普通列,可以重复。只有最左边那一列灰色的行 ID 受这条约束。搞混了会一直找错方向。
三个场景,八成是其中之一
| 场景 | 为什么撞 |
|---|---|
| 用 Concatenate 纵向拼两张表 | 最常见。两张表都是各自读进来的,行 ID 都从 Row0 开始,一摞起来就全撞了。 |
| 读文件时指定了某列当行 ID | CSV Reader 或 Excel Reader 里勾了用某一列作行 ID。那列在业务上允许重复,比如同一个部门出现多次。 |
| 循环里每轮结果往一起收 | Loop End 收集各轮结果,每轮的行 ID 都是从头编的。和第一种是同一个道理。 |
怎么定位
- 看哪个节点先红。报错通常出在 Concatenate、Loop End 或读取节点上,不在它下游那一串。
- 点开它上游各个输入的输出表。看最左边那列行 ID。如果两个输入都是
Row0开头,原因就确认了。 - 如果是读取节点报错,打开它的配置。找有没有勾「用某列作为行 ID」,再回到那一列看有没有重复值。
按场景怎么修
-
拼表时撞车Concatenate / Loop End
打开 Concatenate 的配置,重复行 ID 的处理方式改成给后来的行加后缀,不要选中止执行。加完后缀行 ID 变成
Row0、Row0_dup这种,能跑通且不丢数据。 -
从根上避免撞车RowID 节点
更干净的做法:在每个分支拼起来之前各插一个 RowID 节点,让它重新生成一套连续的行 ID。这样下游做什么操作都不会再撞。行 ID 本来就不该承载业务含义,重排不丢信息。
-
读取时指定了会重复的列CSV Reader / Excel Reader
取消「用某列作为行 ID」,让 KNIME 自己生成。那一列仍然会作为普通数据列留在表里,不会丢。确实需要按它去重的话,后面接 Duplicate Row Filter,那是专门干这个的节点。
别用「跳过重复行」来消灾。Concatenate 的处理方式里有一项是直接丢掉行 ID 重复的行。它确实能让工作流跑通,但会静悄悄地删数据 – 两张表各 500 行,拼完只剩 500 行,而且不报错。做稽核和对账的场景尤其不能选这项。
怎么预防
- 凡是要纵向拼接的分支,拼之前统一先过一个 RowID 节点重排。养成习惯比出错再查快。
- 不要拿业务编号当行 ID。需要按它关联就用 Joiner,需要按它去重就用 Duplicate Row Filter,都不必动行 ID。
- 拼完之后看一眼行数对不对。上游两张表的行数之和,应该等于拼完的行数。

