在Google Cloud Spanner中,我可以通过非主键字段更新或删除吗?

时间:2018-01-10 18:39:47

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

在Cloud Spanner SQL中,似乎我只能通过主键执行UPDATE或DELETE操作。即使是这两个操作的API方法也有一个参数,特别需要一个PK值列表来处理。 在这样的操作中,我不能使用基于非PK字段的标准吗?

2 个答案:

答案 0 :(得分:2)

没有。抱歉,所有UPDATE和DELETE操作都必须涉及他们正在影响的表的主键。

它可能有点像kludge,但你可以做的是从SELECT语句获取PK值列表(它确实让你的WHERE子句使用非PK字段),并传递该列表PK值为UPDATE或DELETE操作。

答案 1 :(得分:0)

您可以尝试将Statement{}ReadWriteTransaction()一起使用。

spannerClient.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
        rowCount, err := txn.Update(ctx, spanner.Statement{
            SQL: "update TABLE_NAME set UPDATE_COLUME=UPDATE_VALUE where CONDITION_COLUMN = @CONDITION_COLUMN",
            Params: map[string]interface{}{
                "CONDITION_COLUMN":  "CONDITION_VALUE",
            },
        })
        if err != nil {
            return err
        }
        if rowCount == 0 {
            return errors.New("no such record")
        }
})