【问题标题】:Cloud Spanner - Insert or Update and Increment DML?Cloud Spanner - 插入或更新和增加 DML?
【发布时间】:2020-02-15 21:30:11
【问题描述】:

有没有办法使用 DML 在 Google Cloud Spanner 中“插入或(更新和增量)”行?

这不起作用:

INSERT INTO table (key, value) VALUES ('ABC', 1) 
       ON DUPLICATE KEY UPDATE value = value + 1
# Syntax error: Unexpected keyword ON

【问题讨论】:

    标签: google-cloud-spanner


    【解决方案1】:

    根据文档Data Manipulation Language syntax 告知:

    如果语句尝试插入由主键确定的重复行,则整个语句将失败。

    因此,很遗憾,无法使用您正在尝试的此类函数进行插入。

    我建议您查看此文档 - Inserting, updating, and deleting data using Data Manipulation Language - 以获取有关将 DML 与 Cloud Spanner 结合使用的更多信息。

    如果这些信息对您有帮助,请告诉我!

    【讨论】:

    • 谢谢。您是否看到任何其他方式,例如通过突变,实现我正在寻找的东西?否则,您是否看到任何其他可以做到这一点的谷歌云服务?看起来连 BigTable 都不支持INSERT .. ON DUPLICATE KEY UPDATE
    • 嗨@user9114945!不幸的是,据我所知,没有办法实现这一目标。我建议您在 Report Issues and Request Features with Issue Trackers 打开一个功能请求,因为它似乎是对系统的一个很好的补充。
    【解决方案2】:

    您无法使用 DML 执行此操作,但您可以使用 Spanner 突变 API 执行此操作。每个范式中可用的功能集比较:https://cloud.google.com/spanner/docs/dml-versus-mutations#feature_comparison_between_dml_and_mutations

    例如,使用 Go 客户端库:

    func write(w io.Writer, db string) error {
            ctx := context.Background()
            client, err := spanner.NewClient(ctx, db)
            if err != nil {
                    return err
            }
            defer client.Close()
    
            singerColumns := []string{"SingerId", "FirstName", "LastName"}
            m := []*spanner.Mutation{
                    spanner.InsertOrUpdate("Singers", singerColumns, []interface{}{1, "Marc", "Richards"}),
                    spanner.InsertOrUpdate("Singers", singerColumns, []interface{}{2, "Catalina", "Smith"}),
            }
            _, err = client.Apply(ctx, m)
            return err
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 2017-07-07
      • 2019-07-08
      相关资源
      最近更新 更多