在 Pentaho Kettle 中,假设一个人想要在两个相同的表 A 和 B 之间复制数据。如果有一个自动递增的列,在将数据从 A 复制到 B 时,是否有办法保留该列的值?自动递增列数据库的行为是特定的还是 Kettle 找到了一个通用的解决方案?
2 回答
如果您有两个表,其列的定义相同,并且两个表中都有一个自动递增列,然后您用数据填充其中一个表,您将递增表 1 中的数字。现在,按顺序要将这些行插入到镜像表中,您必须以与插入它们相同的顺序从第一个表中提取它们,以便它们可以以相同的顺序插入到镜像表中。然后,只有这样,自动递增的数字才会生效。也就是说,这将被认为是脆弱的设计。
另一种方法是使表在列数据类型方面相同,但在镜像表中没有自动递增列。只需将镜像表中的该列设为整数,没有任何自动增量功能。
蒂姆的回答是合理的。我通常会这样做:使表 B 与表 A 相同,除了使表 B 的 PK 不是自动递增列。
(尝试始终以相同的顺序插入数据是一个坏主意。正如蒂姆所说,它肯定会很脆弱。但实际上,情况会更糟。首先,你不能进行批量插入。你需要单独提交每一行。此外,您通常不能确定使用的下一个值将是下一个整数。选择下一个值是 DBMS 的责任。有很多情况下插入的下一个值不会是下一个更高的整数.)
但是一个重要的细节是 DBMS 以不同的方式处理自动递增字段。在许多情况下,自动递增字段的行为是在插入的值为 NULL 时提供一个值,但如果提供了一个则接受一个显式值。在其他情况下,数据库将拒绝将值插入自动递增字段的尝试。
因此,如果您面临前一种情况,那么让表 A 和表 B 完全一样真的不是问题。您的 ETL 作业会将值插入表 B,而 PK 列的自动递增性质将被忽略。