【发布时间】: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
【问题讨论】:
有没有办法使用 DML 在 Google Cloud Spanner 中“插入或(更新和增量)”行?
这不起作用:
INSERT INTO table (key, value) VALUES ('ABC', 1)
ON DUPLICATE KEY UPDATE value = value + 1
# Syntax error: Unexpected keyword ON
【问题讨论】:
根据文档Data Manipulation Language syntax 告知:
如果语句尝试插入由主键确定的重复行,则整个语句将失败。
因此,很遗憾,无法使用您正在尝试的此类函数进行插入。
我建议您查看此文档 - Inserting, updating, and deleting data using Data Manipulation Language - 以获取有关将 DML 与 Cloud Spanner 结合使用的更多信息。
如果这些信息对您有帮助,请告诉我!
【讨论】:
INSERT .. ON DUPLICATE KEY UPDATE
您无法使用 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
}
【讨论】: