由于扳手没有像
这样的ddl功能插入dest as(select * from source_table)
我们如何选择表的子集并将该行复制到另一个表中?
我正在尝试将数据写入临时表,然后在一天结束时将数据移动到存档表。但到目前为止我只能找到解决方案,从源表中选择行并将它们写入新表。这是使用java api完成的,它没有ResultSet到Mutation转换器,所以我需要将表的每一列映射到新表,即使它们完全相同。
另一件事是只更新一个列数据,就像没有办法“update table_name set column = column-1”
再次这样做,我需要读取该行并映射每个字段以更新Mutation,但如果有很多表,我需要为所有这些表编码,这是一个ResultSet - >变异转换也会很好。
是否有任何通用的Mutation克隆和/或在表之间复制数据的任何其他方法?
答案 0 :(得分: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
答案 1 :(得分:0)
执行批量更新的另一种方法是使用 LIMIT 和 OFFSET
插入dest(c1,c2,c3) (从source_table LIMIT 1000中选择c1,c2,c3);
插入dest(c1,c2,c3) (从source_table LIMIT 1000 OFFSET 1001中选择c1,c2,c3);
插入dest(c1,c2,c3) (从source_table LIMIT 1000 OFFSET 2001中选择c1,c2,c3);
。
。
。
到达需要的地方。
PS:这更多的是技巧。但这绝对会节省您的时间。