Use INSERT ... VALUES ou VALUES TABLE para inserir diretamente um pequeno número de linhas em uma tabela do MaxCompute. Essa abordagem é comum durante as fases de desenvolvimento e testes.
Para conjuntos de dados maiores (dezenas de linhas ou mais), use comandos Tunnel para carregar um arquivo TXT ou CSV. Consulte Importar dados para tabelas .
Pré-requisitos
Antes de começar, verifique se você tem:
Permissão ALTER na tabela de destino
Permissão DESCRIBE nos metadados da tabela source
Para obter detalhes, consulte Permissões do MaxCompute.
Plataformas compatíveis
Execute estas instruções em qualquer uma das plataformas a seguir:
Operações
|
Operação |
Quando usar |
|
|
Insira algumas linhas ou dezenas delas em uma tabela de teste durante a fase de validação |
|
|
Realize cálculos simples sobre dados inline. Compatível com instruções |
Limitações
Ao usar INSERT ... VALUES ou VALUES TABLE, não há suporte para INSERT OVERWRITE com especificação de colunas. Use INSERT INTO como alternativa.
Sintaxe
INSERT ... VALUES
INSERT INTO TABLE <table_name>
[PARTITION (<pt_spec>)][(<col1_name>, <col2_name>, ...)]
VALUES (<col1_value>, <col2_value>, ...), (<col1_value>, <col2_value>, ...), ...
VALUES TABLE
VALUES (<col1_value>, <col2_value>, ...), (<col1_value>, <col2_value>, ...) <table_name> (<col1_name>, <col2_name>, ...) ...
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Nome de uma tabela existente onde os dados serão inseridos |
|
|
Não |
Partição de destino. Formato: |
|
|
Não |
Nome da coluna de destino |
|
|
Não |
Valor a ser inserido. Aceita literais, expressões constantes ou expressões não constantes (como funções integradas ou expressões de função definida pelo usuário - UDF). Colunas não listadas em |
Notas de uso
Tipos de valor compatíveis com VALUES
Literais (string, inteiro, decimal)
Expressões constantes
Expressões não constantes, incluindo funções integradas e expressões UDF
Tipos de valor incompatíveis com VALUES
Os itens a seguir não podem ser usados diretamente em uma lista VALUES. Use uma expressão SELECT como alternativa:
Tipos de dados complexos, exceto ARRAY. Para inserir dados ARRAY, use
SELECTcomARRAY()— consulte Inserir dados ARRAY.
Tipos de data e hora
Para inserir dados DATETIME ou TIMESTAMP, especifique o prefixo do tipo de dado em VALUES. Por exemplo: datetime'2017-11-11 00:00:00' ou TIMESTAMP'2017-11-11 00:00:00.123456789'.
Exemplos
Inserir linhas em uma partição específica
Crie uma tabela particionada e insira três linhas em uma partição nomeada.
-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);
-- Add the abc partition to the srcp table.
ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');
-- Insert three rows into the abc partition.
INSERT INTO TABLE srcp PARTITION (p='abc') VALUES ('a', 1), ('b', 2), ('c', 3);
-- Query the partition to verify.
SELECT * FROM srcp WHERE p='abc';
-- Return result
+------------+------------+------------+
| key | value | p |
+------------+------------+------------+
| a | 1 | abc |
| b | 2 | abc |
| c | 3 | abc |
+------------+------------+------------+
Inserir linhas com valores de partição inline
Especifique o valor da coluna de partição diretamente na lista VALUES, em vez de usar a cláusula PARTITION.
-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);
-- Insert rows and derive the partition value from the VALUES list.
INSERT INTO TABLE srcp PARTITION (p)(key, p) VALUES ('d', '20170101'), ('e', '20170101'), ('f', '20170101');
-- Query the partition to verify.
SELECT * FROM srcp WHERE p='20170101';
-- Return result
+------------+------------+------------+
| key | value | p |
+------------+------------+------------+
| d | NULL | 20170101 |
| e | NULL | 20170101 |
| f | NULL | 20170101 |
+------------+------------+------------+
A coluna value não consta na lista de colunas; portanto, seu valor padrão é NULL.
Inserir dados ARRAY
Como literais ARRAY não são aceitos diretamente em VALUES, use uma expressão SELECT com ARRAY() como alternativa.
-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value ARRAY<INT>) PARTITIONED BY (p STRING);
-- Add the abc partition to the srcp table.
ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');
-- Insert an ARRAY value using a SELECT expression.
INSERT INTO TABLE srcp PARTITION (p='abc') SELECT 'a', ARRAY(1, 2, 3);
-- Query the partition to verify.
SELECT * FROM srcp WHERE p='abc';
-- Return result
+------------+------------+------------+
| key | value | p |
+------------+------------+------------+
| a | [1,2,3] | abc |
+------------+------------+------------+
Inserir dados DATETIME e TIMESTAMP
Adicione o nome do tipo de dado como prefixo aos literais de data e hora para evitar erros de inferência de tipo.
-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value TIMESTAMP) PARTITIONED BY (p STRING);
-- Add the abc partition to the srcp table.
ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');
-- Insert DATETIME and TIMESTAMP values with explicit type prefixes.
INSERT INTO TABLE srcp PARTITION (p='abc') VALUES (datetime'2017-11-11 00:00:00', TIMESTAMP'2017-11-11 00:00:00.123456789');
-- Query the partition to verify.
SELECT * FROM srcp WHERE p='abc';
-- Return result
+------------------------+-------------------------+------------+
| key | value | p |
+------------------------+-------------------------+------------+
| 2017-11-11 00:00:00 | 2017-11-11 00:00:00.123 | abc |
+------------------------+-------------------------+------------+
Usar VALUES TABLE com colunas computadas
Referencie os valores inline como uma tabela nomeada e aplique funções durante a execução do INSERT.
-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);
-- Insert data with computed expressions derived from an inline VALUES table t(a, b).
INSERT INTO TABLE srcp PARTITION (p)
SELECT concat(a, b), length(a) + length(b), '20170102'
FROM VALUES ('d', 4), ('e', 5), ('f', 6) t(a, b);
-- Query the partition to verify.
SELECT * FROM srcp WHERE p='20170102';
-- Return result
+------------+------------+------------+
| key | value | p |
+------------+------------+------------+
| d4 | 2 | 20170102 |
| e5 | 2 | 20170102 |
| f6 | 2 | 20170102 |
+------------+------------+------------+
A construção VALUES (...) t(a, b) define uma tabela inline chamada t com as colunas a e b. Os tipos de dados são inferidos da lista VALUES: a é STRING e b é BIGINT.
Criar uma tabela de constantes sem UNION ALL
Use VALUES TABLE como uma alternativa concisa para encadeamentos de instruções SELECT ... UNION ALL.
-- These two statements are equivalent:
SELECT 1 c UNION ALL SELECT 2 c;
SELECT * FROM VALUES (1), (2) t(c);
-- Return result
+------------+
| c |
+------------+
| 1 |
| 2 |
+------------+
Usar VALUES TABLE sem cláusula FROM
Com VALUES TABLE, é possível executar uma instrução SELECT que chama funções sem referenciar nenhuma tabela. A implementação subjacente seleciona dados de uma tabela VALUES anônima de linha única e zero colunas, eliminando a necessidade de uma tabela DUAL.
-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);
-- Insert a row computed entirely from built-in functions.
INSERT INTO TABLE srcp PARTITION (p)
SELECT ABS(-1), LENGTH('abc'), GETDATE();
-- Query all rows.
SET odps.sql.allow.fullscan=true;
SELECT * FROM srcp;
-- Return result
+------------+------------+---------------------+
| key | value | p |
+------------+------------+---------------------+
| 1 | 3 | 2024-12-10 16:58:56 |
+------------+------------+---------------------+
Usar expressões não constantes em VALUES
Passe chamadas de função diretamente como valores de coluna em uma lista VALUES.
SELECT * FROM VALUES (GETDATE()), (TO_DATE('20190101', 'yyyyMMdd')), (LASTDAY(DATETIME '2019-01-01 01:10:00')) t(d);
Resultado:
+---------------------+
| d |
+---------------------+
| 2019-01-31 00:00:00 |
| 2019-01-01 00:00:00 |
| 2024-12-10 16:52:36 |
+---------------------+