O ApsaraDB for SelectDB suporta sintaxe SQL padrão, incluindo instruções INSERT INTO para importar dados em tabelas do SelectDB. Use INSERT INTO...SELECT para executar ETL em tabelas internas ou sincronizar dados de data lakes externos e INSERT INTO...VALUES apenas para testes e validação.
Quando usar INSERT INTO
O INSERT INTO possui duas variantes. Escolha a mais adequada ao seu cenário:
|
Variante |
Use quando |
Evite quando |
|
|
Executar ETL em tabelas internas ou sincronizar dados de data lakes externos via catalog |
— |
|
|
Testar e validar |
Ambientes de produção ou grandes volumes de dados |
A instrução INSERT INTO...VALUES tem baixo throughput de escrita. Para cargas de trabalho de produção com escritas pequenas, mas frequentes, use o Stream Load, que oferece desempenho de escrita significativamente superior.
Como funciona
Ambas as variantes são síncronas: a instrução retorna somente após a conclusão da importação. Cada importação cria uma transação com um label exclusivo. O resultado inclui o label, o ID da transação e o status de visibilidade dos dados.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ApsaraDB for SelectDB
Uma tabela de destino no SelectDB
Permissões de escrita na tabela de destino
Instrução INSERT INTO...SELECT
Use esta variante para executar operações de extração, transformação e carga (ETL) em dados que já estão no SelectDB ou para sincronizar dados de fontes externas por meio de um catalog.
Executar ETL em uma tabela interna
Para transformar dados de uma tabela do SelectDB e gravar os resultados em outra:
INSERT INTO bj_store_sales
SELECT id, total, user_id, sale_timestamp FROM store_sales WHERE region = "bj";
Este comando lê linhas da tabela store_sales onde region = "bj" e as grava em bj_store_sales.
Sincronizar dados de um data lake
Os catalogs do SelectDB permitem mapear fontes de dados externas — incluindo Hive, Iceberg, Hudi, Elasticsearch e fontes Java Database Connectivity (JDBC) — e consultá-las com consultas federadas. Use um catalog para sincronizar dados de um data lake para uma tabela do SelectDB.
O exemplo a seguir sincroniza dados de uma fonte Hive para o SelectDB.
Conecte-se à sua instância do SelectDB. Para mais detalhes, consulte Conectar-se a uma instância do ApsaraDB for SelectDB usando um cliente MySQL.
Crie um catalog para integrar a source de dados Hive. Para mais detalhes, consulte Fonte de dados Hive.
-
(Opcional) Crie um banco de dados de destino. Ignore esta etapa se o banco de dados já existir.
CREATE DATABASE hive_db; -
Mude para o banco de dados de destino.
USE hive_db; -
Crie uma tabela de destino. Se a tabela já existir, verifique se os tipos de coluna correspondem aos da tabela de origem. Para referência de mapeamento de tipos, consulte Mapeamentos de tipos de dados de colunas.
CREATE TABLE test_Hive2SelectDB ( id int, name varchar(50), age int ) DISTRIBUTED BY HASH(id) BUCKETS 4 PROPERTIES("replication_num" = "1"); -
(Opcional) Visualize a tabela antes da importação.
SELECT * FROM test_Hive2SelectDB;
-
Execute a instrução INSERT INTO...SELECT para sincronizar os dados. Atribua um label exclusivo ao job de importação com
WITH LABEL.INSERT INTO test_Hive2SelectDB WITH LABEL test_label SELECT * FROM hive_catalog.testdb.hive_t; -
Consulte a tabela de destino para verificar os dados. Os dados da tabela de destino aparecem à esquerda e os dados de origem à direita.

Instrução INSERT INTO...VALUES
Use esta variante apenas para testes e validação, não em produção. Envie solicitações de inserção por meio de um cliente SQL ou uma aplicação JDBC.
Primeiro, crie uma tabela de destino:
CREATE TABLE test_table
(
id int,
name varchar(50),
age int
)
DISTRIBUTED BY HASH(id) BUCKETS 4
PROPERTIES("replication_num" = "1");
Usando um cliente SQL
Agrupe várias instruções INSERT INTO em uma transação para combiná-las em uma única importação:
BEGIN;
INSERT INTO test_table VALUES (1, 'Zhang San', 32),(2, 'Li Si', 45),(3, 'Zhao Liu', 23);
INSERT INTO test_table VALUES (4, 'Wang Yi', 32),(5, 'Zhao Er', 45),(6, 'Li Er', 23);
INSERT INTO test_table VALUES (7, 'Li Yi', 32),(8, 'Wang San', 45),(9, 'Zhao Si', 23);
COMMIT;
Usando uma aplicação JDBC
O exemplo a seguir agrupa várias instruções INSERT INTO em uma única transação usando JDBC. Substitua os valores de espaço reservado pelos seus próprios valores.
public static void main(String[] args) throws Exception {
// Number of INSERT statements per batch
int insertNum = 10;
// Number of rows per INSERT statement
int batchSize = 10000;
// Replace <host> and <port> with your VPC (virtual private cloud) endpoint values.
// Find these on the Instance Details page under Network Information.
String URL = "jdbc:mysql://<host>:<port>/test_db?useLocalSessionState=true";
Connection connection = DriverManager.getConnection(URL, "admin", "<password>");
Statement statement = connection.createStatement();
statement.execute("BEGIN;");
for (int num = 0; num < insertNum; num++) {
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO test_table VALUES ");
for (int i = 0; i < batchSize; i++) {
if (i > 0) {
sql.append(",");
}
// Replace with your actual field values
sql.append("(1, 'Zhang San', 32)");
}
statement.addBatch(sql.toString());
}
statement.addBatch("COMMIT;");
statement.executeBatch();
statement.close();
connection.close();
}
Entender o resultado da importação
O INSERT INTO é síncrono: verifique o valor de retorno para determinar o resultado.
Importação bem-sucedida sem linhas
Se a cláusula SELECT não retornar linhas, o SelectDB exibe:
INSERT INTO tbl1 SELECT * FROM empty_tbl;
Query OK, 0 rows affected (0.02 sec)
Query OK indica que a instrução foi executada sem erros. 0 rows affected significa que nenhum dado foi importado.
Importação bem-sucedida com linhas
INSERT INTO tbl1 SELECT * FROM tbl2;
Query OK, 4 rows affected (0.38 sec)
{'label':'insert_8510c568-9eda-****-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}
A resposta JSON inclui:
|
Campo |
Descrição |
|
|
Identificador do job de importação — seja o valor especificado com |
|
|
Visibilidade dos dados. |
|
|
ID da transação desta importação. |
|
|
Quaisquer erros inesperados. |
Se o status for committed, os dados eventualmente ficarão visíveis. Para verificar:
SHOW TRANSACTION WHERE id=4005;
Se TransactionStatus mostrar visible, os dados estarão disponíveis para consulta.
Importação bem-sucedida com linhas filtradas
Se algumas linhas forem filtradas, o resultado exibirá uma contagem de avisos:
Query OK, 2 rows affected, 2 warnings (0.31 sec)
{'label':'insert_f0747f0e-7a35-****-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}
Para inspecionar as linhas filtradas, localize o label na saída do SHOW LOAD:
SHOW LOAD WHERE label="insert_f0747f0e-7a35-****-affa-13a235f4020d";
Em seguida, consulte os detalhes do erro usando a URL fornecida na saída:
SHOW LOAD WARNINGS ON "<error-url>";
Importação com falha
Se a importação falhar, nenhum dado será gravado e o SelectDB retornará um erro:
INSERT INTO tbl1 SELECT * FROM tbl2 WHERE k1 = "a";
ERROR 1064 (HY000): all partitions have no load data. url: http://10.74.167.16:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2
Obtenha informações detalhadas sobre o erro usando a URL presente na mensagem de erro:
SHOW LOAD WARNINGS ON "<error-url>";
Referência de configuração
Variáveis de sessão
|
Variável |
Padrão |
Descrição |
|
|
300s (5 min) |
Tempo limite para a operação INSERT INTO. Se a importação não terminar dentro desse período, o SelectDB a cancelará. |
|
|
|
Quando definido como |
|
|
|
Quando definido como |
Atualizações parciais de colunas
Por padrão, o INSERT INTO grava linhas completas. Para atualizar apenas colunas específicas em uma tabela de modelo Unique Key que usa Merge on Write (MOW):
SET enable_unique_key_partial_update = true;
Esta variável aplica-se apenas a tabelas que usam o modelo Unique Key com modo Merge on Write (MOW).
Se tanto
enable_unique_key_partial_updatequantoenable_insert_strictestiverem definidos comotrue, o INSERT INTO poderá apenas atualizar linhas existentes. Caso uma chave não exista na tabela, um erro será retornado.Para atualizar colunas existentes e inserir novas linhas simultaneamente, defina
enable_unique_key_partial_update = trueeenable_insert_strict = false. Para mais detalhes, consulte Configurar variáveis.
Para obter a lista completa de variáveis, consulte Gerenciamento de variáveis.
Melhores práticas
Evite escritas pequenas e de alta frequência. Inserções pequenas e frequentes degradam o desempenho e podem causar deadlocks nas tabelas. Mantenha a frequência de escrita em uma única tabela acima de 10 segundos por escrita e agrupe várias linhas em uma única instrução INSERT INTO.
Tamanho do lote para INSERT INTO...VALUES. Agrupe entre 1.000 e 1.000.000 de linhas por instrução para obter desempenho ideal.
Use Stream Load para ingestão em produção. Em ambientes de produção e com grandes volumes de dados, prefira o Stream Load em vez do INSERT INTO...VALUES.
Atribua labels para rastreabilidade. Use WITH LABEL para atribuir labels significativos aos jobs de importação. Isso facilita a consulta do status do job e a depuração de erros. Se desejar usar expressões de tabela comuns (CTEs) para definir subconsultas em uma instrução INSERT INTO, especifique WITH LABEL e column.
Limiar de filtragem. O INSERT INTO não suporta o parâmetro max_filter_ratio. Por padrão, todas as linhas com erro são ignoradas (equivalente a max_filter_ratio = 1). Para impor tolerância zero a erros de dados, defina enable_insert_strict = true.
Perguntas frequentes
Por que o erro get table cloud commit lock timeout aparece durante a importação?
Isso ocorre quando as escritas na mesma tabela são muito frequentes, causando contenção de bloqueio. Reduza a frequência de escrita para que cada tabela receba escritas no máximo uma vez a cada 5 segundos e consolide várias inserções pequenas em lotes maiores e menos frequentes.
Próximos passos
Stream Load — ingestão de alto throughput para casos de uso em produção
Data lakehouse — integre fontes de dados externas ao SelectDB
Gerenciamento de variáveis — configure variáveis de sessão para o comportamento do INSERT INTO