2010-11-23 70 views
0

在Pentaho Kettle中,假设您想在两个相同的表A和B之间复制数据。如果存在自动递增的列,那么有一种方法可以在保存该列的值时将数据从A复制到B?自动递增列数据库的行为是特定的还是已经找到了一个通用的解决方案?在Pentaho Kettle中保留自动递增的列

回答

1

如果您有两个表(关于其列的定义相同),并且两个表中都有一个自动递增列,然后用数据填充其中一个表,则您将增加表1中的数字。现在,为了将这些行插入到镜像表中,必须按照与插入的顺序相同的顺序从第一个表中提取它们,以便它们可以按照相同的顺序插入到镜像表中。然后,只有这样,自动递增的号码才会嗡嗡作响。这就是说,这将被认为是脆弱的设计。

另一种方法是使表与列数据类型相同,但镜像表中没有自动递增列。只需在镜像表中将该列设置为一个整数,而不具有任何自动增量功能。

1

蒂姆的回答是合理的。我通常会这样做:使表B与表A相同,除了使表B的PK不是自动递增列。 (试图总是以相同的顺序插入数据将是一个不好的主意,正如Tim提到的那样,它肯定会很脆弱,但实际上,这会比这更糟糕,首先,你不能做批量插入。您需要分别提交每一行,而且通常不能确定下一个使用的值是下一个整数,这是DBMS挑选下一个值的责任,有很多情况下插入的下一个值不会下一个更大的整数)。

但是一个重要的细节是DBMS处理自动递增字段的不同。在许多情况下,如果插入的值为NULL,则自动递增字段的行为是提供值,但如果提供了值,则接受显式值。在其他情况下,数据库将拒绝尝试将值插入自动递增字段。

所以如果你面对的是前一种情况,那么把表A和表B完全相同是没有问题的。您的ETL作业将在表B中插入值,并且PK列的自动递增特性将被忽略。