Google Spanner - 如何将数据复制到另一个表?

hal*_*lil 6 google-cloud-platform google-cloud-spanner

由于spanner没有像这样的ddl功能

插入到 dest as (select * from source_table)

我们如何选择表的子集并将这些行复制到另一个表中?

我正在尝试将数据写入临时表,然后在一天结束时将数据移至存档表。但到目前为止我能找到的唯一解决方案是,从源表中选择行并将它们写入新表。这是使用 java api 完成的,并且它没有 ResultSet 到 Mutation 转换器,所以我需要将表的每一列映射到新表,即使它们完全相同。


另一件事是只更新一列数据,就像无法执行“update table_name set column=column-1”

再次要做到这一点,我需要读取该行并映射每个字段来更新 Mutation,但是如果有很多表,这没有用,我需要为所有表编写代码,转换的 ResultSet -> Mutation 也很好。

是否有任何通用的突变克隆器和/或任何其他方式在表之间复制数据?

Knu*_*ite 5

从版本 0.15 开始,这个开源 JDBC 驱动程序支持批量 INSERT 语句,可用于将数据从一个表复制到另一个表。INSERT 语法还可用于对数据执行批量更新。

批量插入示例:

INSERT INTO TABLE  
(COL1, COL2, COL3)  
SELECT C1, C2, C3  
FROM OTHER_TABLE  
WHERE C1>1000  
Run Code Online (Sandbox Code Playgroud)

批量更新是使用 INSERT 语句并添加 ON DUPLICATE KEY UPDATE 来完成的。您必须在插入语句中包含主键的值,以便“强制”键违规,从而确保更新现有行:

INSERT INTO TABLE  
(COL1, COL2, COL3)  
SELECT COL1, COL2+1, COL3+COL2  
FROM TABLE  
WHERE COL2<1000  
ON DUPLICATE KEY UPDATE  
Run Code Online (Sandbox Code Playgroud)

您可以将 JDBC 驱动程序与SQuirreL一起使用来测试它,或者进行临时数据操作。

请注意,Cloud Spanner 的基本限制仍然适用,这意味着一笔交易中最多有 20,000 个突变。AllowExtendedMode=trueJDBC 驱动程序可以通过在连接字符串或连接属性中指定值来解决此限制。当允许此模式时,并且您发出将超出一个事务限制的批量 INSERT 或 UPDATE 语句,驱动程序将自动打开一个额外的连接,并在新连接上批量执行批量操作。这意味着批量操作不会以原子方式执行,并且会在每个成功的批次后自动提交,但至少它会自动为您完成。

看看这里更多的例子:http://www.googlecloudspanner.com/2018/02/data-manipulation-language-with-google.html