Могу ли я обновить или удалить в Google Cloud Spanner поле, не являющееся первичным ключом?

Кажется, что в Cloud Spanner SQL я могу выполнять операцию UPDATE или DELETE только по первичному ключу. Даже у методов API для этих двух операций есть аргумент, который требует, в частности, списка значений PK для работы. Могу ли я использовать в такой операции критерии, основанные на поле, отличном от PK?


person Solomon Chang    schedule 10.01.2018    source источник


Ответы (2)


Нет. К сожалению, все операции UPDATE и DELETE должны включать первичный ключ таблицы, на которую они влияют.

Это может быть немного путаница, но вместо этого вы можете получить список значений PK из оператора SELECT (который позволяет вашему предложению WHERE использовать поле, отличное от PK) и передать этот список значений PK в операция ОБНОВЛЕНИЕ или УДАЛЕНИЕ.

person Solomon Chang    schedule 10.01.2018

Вы можете попробовать 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")
        }
})
person Tony Yu    schedule 01.11.2019