Кажется, что в Cloud Spanner SQL я могу выполнять операцию UPDATE или DELETE только по первичному ключу. Даже у методов API для этих двух операций есть аргумент, который требует, в частности, списка значений PK для работы. Могу ли я использовать в такой операции критерии, основанные на поле, отличном от PK?
Могу ли я обновить или удалить в Google Cloud Spanner поле, не являющееся первичным ключом?
Ответы (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