Tabelas não transacionais no Tablestore aceitam instruções INSERT, UPDATE e DELETE via SQL.
Escopo
|
Item |
Descrição |
|
Tipo de tabela |
Apenas tabelas não transacionais (criadas sem transações habilitadas) |
|
Instruções DML compatíveis |
INSERT, UPDATE, DELETE |
|
Instruções de consulta |
SELECT e SHOW não estão sujeitas às restrições de DML. Para mais informações, consulte a documentação de consultas SQL. |
|
Sintaxe parcial de DML |
INSERT IGNORE, ON DUPLICATE KEY UPDATE, REPLACE e sintaxes similares são compatíveis apenas com tabelas transacionais. |
Pré-requisitos
Verifique se você tem:
Uma tabela não transacional
Um mapeamento SQL criado para a tabela por meio da instrução CREATE TABLE
Para executar operações DML com um usuário RAM, conceda a permissão SQL_DML a esse usuário. Para mais informações, consulte Política do RAM.
Métodos de acesso
Execute operações DML pelo console, SDKs ou outros métodos de acesso.
Console
Acesse o console do Tablestore.
Na página Overview, clique em Instance Name.
Na página Instances, clique na aba Query by Executing SQL Statement.
Insira uma instrução DML no editor SQL e clique em Execute SQL Statement.
Exemplo: inserir uma linha.
INSERT INTO my_table VALUES (1, 'value1', 100);
SDK
Java
Use SyncClient.sqlQuery() no SDK do Tablestore para Java para executar instruções DML. Chame getAffectedRows() em SQLQueryResponse para obter o número de linhas afetadas e getConsumedCapacity() para obter as CUs de leitura e escrita consumidas.
É necessária a versão 5.17.11 ou posterior do SDK.
SQLQueryRequest request = new SQLQueryRequest("INSERT INTO my_table VALUES (1, 'value1', 100)");
SQLQueryResponse response = client.sqlQuery(request);
long affectedRows = response.getAffectedRows();
Map<String, ConsumedCapacity> consumedCapacity = response.getConsumedCapacity();
Go
Use TableStoreClient.SQLQuery() no SDK do Tablestore para Go para executar instruções DML. Leia o campo AffectedRows de SQLQueryResponse para obter o número de linhas afetadas e SQLQueryConsumed para obter as CUs de leitura e escrita consumidas.
É necessária a versão 1.9.2 ou posterior do SDK.
request := &tablestore.SQLQueryRequest{Query: "INSERT INTO my_table VALUES (1, 1, 100, 'hello')"}
response, err := client.SQLQuery(request)
if err != nil {
log.Fatal(err)
}
affectedRows := response.AffectedRows
consumed := response.SQLQueryConsumed
Instruções INSERT
Tabelas não transacionais aceitam inserções de linha única e inserções em lote atômicas de várias linhas dentro da mesma chave de partição. Se ocorrer um conflito de chave primária, o sistema retornará um erro e não sobrescreverá os dados existentes.
Inserção de linha única
INSERT INTO user_table VALUES (1, 'value1', 100);
Inserção em lote de várias linhas na mesma chave de partição
É possível inserir atomicamente em lote linhas que compartilham a mesma chave de partição, com limite de 200 linhas por lote. O exemplo a seguir usa o esquema de tabela user_table(pk1 BIGINT, pk2 VARCHAR(1024), value BIGINT), em que pk1 é a chave de partição. Como ambas as linhas têm pk1 = 1, elas pertencem à mesma partição.
INSERT INTO user_table VALUES (1, 'attr1', 100), (1, 'attr2', 200);
Observações de uso
Conflito de chave primária: a inserção de uma linha com chave primária já existente retorna o código de erro
OTSParameterInvalidcom uma mensagem contendoDuplicate entry for key 'PRIMARY'. Os dados existentes não são sobrescritos.Inserção em lote entre partições: todas as linhas em um INSERT em lote devem compartilhar a mesma chave de partição. Inserções em lote com chaves de partição diferentes falham.
Limite de tamanho do lote: um INSERT em lote com mais de 200 linhas é rejeitado.
Linhas afetadas: um INSERT de linha única retorna 1 em caso de sucesso. Um INSERT em lote de N linhas retorna N em caso de sucesso. Conflitos de chave primária não retornam linhas afetadas e geram erro diretamente.
Instruções UPDATE
Tabelas não transacionais aceitam apenas atualizações de linha única identificadas por condição de igualdade completa da chave primária na cláusula WHERE. Para chaves primárias compostas, a ordem das colunas na cláusula WHERE não precisa corresponder à ordem de definição da chave primária.
Atualização com valores constantes
Atualize uma ou mais colunas simultaneamente.
-- Single-column update
UPDATE user_table SET attr_col = 999 WHERE pk_col = 1;
-- Multi-column update
UPDATE user_table SET c1 = 10, c2 = 20, c3 = 'updated' WHERE id = 1;
-- Composite primary key update. The column order in the WHERE clause can differ from the key definition order.
UPDATE user_table SET value = 999 WHERE pk2 = 2 AND pk1 = 1;
Incremento e decremento atômicos
Incremente ou decremente atomicamente colunas de atributo inteiras (BIGINT). Esse recurso é útil para contadores e casos de uso semelhantes. Apenas colunas de atributo BIGINT são compatíveis.
-- Increment by 1
UPDATE user_table SET counter = counter + 1 WHERE id = 1;
-- Increment by a specified value
UPDATE user_table SET counter = counter + 10 WHERE id = 1;
-- Decrement
UPDATE user_table SET counter = counter - 5 WHERE id = 1;
Definir uma coluna de atributo como NULL
Definir uma coluna de atributo como NULL remove a coluna da linha em vez de armazenar um valor NULL.
UPDATE user_table SET attr_col = NULL WHERE pk_col = 1;
Observações de uso
-
A cláusula WHERE deve especificar a chave primária completa com condições de igualdade: os casos a seguir não são compatíveis e retornam o código de erro
OTSParameterInvalidouOTSUnsupportOperation:A cláusula WHERE não contém a chave primária completa.
A cláusula WHERE referencia colunas fora da chave primária.
A cláusula WHERE usa condições de intervalo (
>,<,BETWEENe operadores similares).A cláusula WHERE usa
IN,LIKE,OR,!=ou outras condições de não igualdade.A cláusula WHERE inclui condições de coluna de atributo além da chave primária completa.
Colunas de chave primária não podem ser modificadas: o UPDATE não permite alterar valores de colunas de chave primária por meio do SET.
Linha inexistente: a atualização de uma linha inexistente é concluída silenciosamente com 0 linhas afetadas e nenhum erro.
Instruções DELETE
Tabelas não transacionais aceitam apenas exclusões de linha única identificadas por condição de igualdade completa da chave primária na cláusula WHERE. Assim como no UPDATE, a ordem das colunas na cláusula WHERE não precisa corresponder à ordem de definição da chave primária para chaves primárias compostas.
-- Single primary key
DELETE FROM user_table WHERE pk_col = 1;
-- String primary key
DELETE FROM user_table WHERE id = 'abc';
-- Composite primary key
DELETE FROM user_table WHERE pk1 = 1 AND pk2 = 1;
-- Composite primary key with different column order
DELETE FROM user_table WHERE pk2 = 2 AND pk1 = 1;
Observações de uso
A cláusula WHERE deve especificar a chave primária completa com condições de igualdade: aplicam-se as mesmas restrições do UPDATE. Cláusula WHERE ausente, chave primária parcial, condições em colunas fora da chave primária, condições de intervalo,
IN,LIKE,ORe condições adicionais de coluna de atributo não são compatíveis.Linha inexistente: a exclusão de uma linha inexistente é concluída silenciosamente com 0 linhas afetadas e nenhum erro.
Limitações
As operações DML em tabelas não transacionais apresentam limitações de sintaxe SQL, tipos de dados, opções de coluna e tipos especiais de tabela.
Limitações de sintaxe SQL
As seguintes sintaxes SQL não são compatíveis:
|
Limitação |
Aplica-se a |
Descrição |
|
Sem cláusula WHERE |
UPDATE, DELETE |
A chave primária completa deve ser especificada. |
|
Colunas fora da chave primária no WHERE |
UPDATE, DELETE |
Apenas condições de igualdade de chave primária são compatíveis. |
|
Chave primária parcial no WHERE |
UPDATE, DELETE |
Todas as colunas de uma chave primária composta devem ser especificadas. |
|
Condições de intervalo ( |
UPDATE, DELETE |
Apenas condições de igualdade são compatíveis. |
|
Cláusula |
UPDATE, DELETE |
Apenas correspondência de igualdade de valor único é compatível. |
|
Condições |
UPDATE, DELETE |
Correspondência de padrões não é compatível. |
|
Condições |
UPDATE, DELETE |
OR lógico não é compatível. |
|
Condições |
UPDATE, DELETE |
Condições de desigualdade não são compatíveis. |
|
Condições |
UPDATE, DELETE |
Verificações de NULL em colunas de atributo não são compatíveis. |
|
Combinação de chave primária + coluna de atributo |
UPDATE, DELETE |
Apenas condições puras de igualdade de chave primária são compatíveis. |
|
ORDER BY |
UPDATE, DELETE |
Ordenação não é compatível. |
|
LIMIT |
UPDATE, DELETE |
Limites de contagem de linhas não são compatíveis. |
|
Opção IGNORE |
UPDATE, DELETE |
Supressão de erros não é compatível. |
|
Configurações de prioridade (ex.: HIGH_PRIORITY) |
INSERT, UPDATE, DELETE |
Não compatível. |
|
Operações multitabela |
UPDATE, DELETE |
Operações entre tabelas não são compatíveis. |
|
Especificação de partição |
INSERT, UPDATE, DELETE |
Não compatível. |
|
Dicas de índice |
UPDATE, DELETE |
Não compatível. |
|
Sintaxe INSERT SET |
INSERT |
|
|
INSERT ... SELECT |
INSERT |
Inserção a partir de resultados de consulta não é compatível. |
|
INSERT IGNORE |
INSERT |
Não compatível com tabelas não transacionais. |
|
ON DUPLICATE KEY UPDATE |
INSERT |
Não compatível com tabelas não transacionais. |
|
REPLACE |
INSERT |
Não compatível. |
|
Atualização de colunas de chave primária |
UPDATE |
Valores de colunas de chave primária não podem ser alterados via SET. |
|
Limite de linhas no INSERT em lote |
INSERT |
Máximo de 200 linhas por lote dentro da mesma chave de partição. |
Limitações de tipo de dados
|
Tipo de dado |
Pode ser chave primária |
Limitações |
|
BIGINT |
Sim |
UNSIGNED não é compatível. O intervalo válido para chave primária é de |
|
VARCHAR |
Sim |
Pode ser usado como coluna de chave primária. |
|
VARBINARY |
Sim |
Pode ser usado como coluna de chave primária. |
|
DOUBLE |
Não |
Não pode ser usado como chave primária. |
|
MEDIUMBLOB |
Não |
Não pode ser usado como chave primária. Pode ser apenas coluna de atributo. |
|
MEDIUMTEXT |
Não |
Não pode ser usado como chave primária. |
|
BOOL / TINYINT(1) |
Não |
O comprimento deve ser 1. Não pode ser usado como chave primária. |
Opções e restrições de coluna
O CREATE TABLE aceita apenas as seguintes opções de coluna: PRIMARY KEY, NOT NULL, NULL, DEFAULT VALUE e ON UPDATE. AUTO_INCREMENT, UNIQUE, CHECK, COMMENT e outras opções de coluna não são compatíveis.
Quanto a restrições, apenas PRIMARY KEY é compatível. UNIQUE, FOREIGN KEY, CHECK e outras restrições não são compatíveis.
Limitações de tipo especial de tabela
Tabelas vinculadas a índices de pesquisa e tabelas de alias não aceitam nenhuma operação DML (INSERT, UPDATE, DELETE).
Faturamento
Operações INSERT, UPDATE e DELETE em tabelas não transacionais são operações atômicas de linha única. Antes de cada gravação, o Tablestore valida a linha de destino, verificando, por exemplo, se ela existe ou se os valores das colunas foram alterados. Essa validação consome CUs de leitura.
Gravação efetiva ocorre: tanto CUs de leitura quanto de escrita são consumidas.
Nenhuma gravação efetiva ocorre (INSERT com conflito de chave primária, UPDATE ou DELETE em linha inexistente, ou UPDATE com valores de coluna inalterados): apenas CUs de leitura são consumidas. Nenhuma CU de escrita é consumida.