Spanner - 从表中删除一行或全部行

时间:2018-02-20 21:05:45

标签: google-cloud-platform google-cloud-spanner

我想从扳手表中删除一行或所有行。表的主键是int64。我不想放弃桌子并重新创建它。我使用谷歌提供的Java教程作为指导(我不是Java程序员 - 自产品问世以来一直是MS SQL Server开发人员)。这就是我的代码。没有删除任何行,也没有抛出错误。

static void perfmonTestDelete(DatabaseClient dbClient) {
    LocalDateTime datetimeStart = LocalDateTime.now();
    LocalDateTime datetimeEnd;

    Mutation.delete("productPerfmon",KeySet.all());

    datetimeEnd = LocalDateTime.now();
    long diffInSeconds = java.time.Duration.between(datetimeStart, datetimeEnd).getSeconds();
        System.out.println("DurationInSeconds:" + diffInSeconds);

} 

这是在我要删除的表中填充10行的代码:

static void perfmonTest(DatabaseClient dbClient) {
    LocalDateTime datetimeStart = LocalDateTime.now();
    LocalDateTime datetimeEnd;
    List<Mutation> mutations = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        mutations.add(Mutation.newInsertBuilder("productPerfmon")
              .set("product_id")
              .to(i)
              .set("product_code")
              .to("test")
              .set("product_code_v")
              .to("test_v")
              .build());
    }
    dbClient.write(mutations);

    datetimeEnd = LocalDateTime.now();
    long diffInSeconds = java.time.Duration.between(datetimeStart, datetimeEnd).getSeconds();
        System.out.println("DurationInSeconds:" + diffInSeconds);

} 

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

要删除一行或多行,您需要使用singleKeykeyRange选择器:

SpannerOptions options = SpannerOptions.newBuilder().build();
Spanner spanner = options.getService();
DatabaseClient dbClient = spanner.getDatabaseClient(DatabaseId.of(
        options.getProjectId(), "InstanceId", "databaseName"));

List<Mutation> mutations = new ArrayList<>();
// Single row by key
mutations.add(Mutation.delete("tableName", 
    KeySet.singleKey(Key.newBuilder().append("Key").build())));

// Multiple rows by range
mutations.add(Mutation.delete("tableName",
    KeySet.range(
        KeyRange.newBuilder()
            .setStart(Key.newBuilder().append("StartKeyIncl").build())
            .setEnd(Key.newBuilder().append("EndKeyNotIncl").build())
            .build())));
dbClient.write(mutations);

要删除表格中的所有行,您可以执行以下操作:

List<Mutation> mutations = new ArrayList<>();
mutations.add(Mutation.delete("tableName", KeySet.all()));
dbClient.write(mutations);

答案 1 :(得分:1)

该文档指出Google Spanner符合ANSI SQL-2011。但是我没有在Cloud Spanner中找到任何DELETE,UPDATE和INSERT的例子。

我对SQL-2011的理解是,它肯定包括对DELETE,INSERT和UPDATE的支持。

在这种情况下,添加行或删除它们将成为单个SQL语句,并且Java Client使用JDBC进行连接。