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

问题描述 投票:3回答:1

由于扳手没有像ddl这样的功能

插入到目标为(select * from source_table)

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

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


另一件事是只更新一个列数据,就像没有办法做“update table_name set column = column-1”

再次这样做,我需要读取该行并映射每个字段以更新Mutation,但如果有很多表,我需要为所有这些表编码,一个ResultSet - > Mutation转换也很好。

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

google-cloud-platform google-cloud-spanner
1个回答
2
投票

从版本0.15开始,this open source JDBC Driver支持批量INSERT语句,可用于将数据从一个表复制到另一个表。 INSERT语法还可用于对数据执行批量更新。

批量插入示例:

INSERT INTO TABLE  
(COL1, COL2, COL3)  
SELECT C1, C2, C3  
FROM OTHER_TABLE  
WHERE C1>1000  

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

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

您可以使用JDBC驱动程序(例如SQuirreL)对其进行测试,或者进行临时数据操作。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.