Todos os produtos
Search
Central de documentação

MaxCompute:Tabela PK - Atualizar dados em colunas específicas

Última atualização: Sep 02, 2026

Gravar em uma tabela larga coluna por coluna é custoso quando cada INSERT ou UPDATE exige a especificação de todas as colunas. A atualização parcial de colunas remove essa restrição: especifique apenas as colunas que deseja modificar e o MaxCompute processa o restante automaticamente, conforme o tipo de operação.

Como funciona

O comportamento das colunas não especificadas depende da operação:

Operação

Colunas não especificadas

INSERT INTO / INSERT OVERWRITE

Definidas como NULL

UPDATE

Mantidas inalteradas

MERGE INTO (WHEN MATCHED UPDATE SET)

Mantidas inalteradas

MERGE INTO (WHEN NOT MATCHED INSERT)

Definidas como NULL

Essa distinção é fundamental: o INSERT preenche as colunas ausentes com NULL, enquanto o UPDATE e o WHEN MATCHED as mantêm intactas.

Casos de uso

O caso de uso mais comum é a construção de tabelas largas a partir de um esquema estrela. Quando várias tabelas source compartilham a mesma chave primária, grave as colunas de cada tabela source na tabela larga de forma independente e paralela. Durante a leitura, o MaxCompute mescla as linhas pela chave primária e retorna registros completos. Comparada à gravação de todas as colunas em uma única operação, essa abordagem melhora o desempenho de leitura e gravação e reduz os custos de armazenamento.

Pré-requisitos

Antes de começar, verifique se você tem:

  • Uma tabela Delta com atualização parcial de colunas ativada (consulte Crie uma tabela Delta)

  • Familiaridade com instruções DML do MaxCompute: INSERT INTO, UPDATE, DELETE e MERGE INTO

Crie uma tabela Delta

Para ativar a atualização parcial de colunas, defina duas propriedades de tabela ao criar a tabela:

CREATE TABLE delta_target
(
    key  BIGINT NOT NULL PRIMARY KEY,
    b    STRING,
    c    BIGINT
)
TBLPROPERTIES (
    "acid.partial.fields.update.enable" = "true",
    "transactional" = "true"
);

Defina tanto acid.partial.fields.update.enable quanto transactional como "true". O recurso suporta tabelas particionadas e não particionadas.

Inserir dados em colunas específicas

Use INSERT INTO para gravar valores em um subconjunto de colunas. As colunas ausentes na lista de colunas são definidas como NULL. Ao inserir uma linha com uma chave primária já existente, o MaxCompute atualiza apenas as colunas especificadas e mantém as demais inalteradas. Isso funciona efetivamente como uma atualização parcial via inserção.

Exemplo 1: Inserir uma nova linha, omitindo a coluna c

A coluna c não está listada; portanto, é definida como NULL.

INSERT INTO TABLE delta_target(key, b) VALUES(1, '1');

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 1          | 1          | NULL       |
+------------+------------+------------+

Exemplo 2: Inserir uma linha com chave primária duplicada para atualizar uma coluna específica

Já existe uma linha com key=1. A inserção com a mesma chave primária atualiza a coluna especificada (c) e mantém a coluna não especificada (b) inalterada.

INSERT INTO TABLE delta_target(key, c) VALUES(1, 1);

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 1          | 1          | 1          |
+------------+------------+------------+

Exemplo 3: Atualizar outra coluna mantendo c inalterada

Como a coluna c não está listada, ela mantém seu valor atual de 1.

INSERT INTO TABLE delta_target(key, b) VALUES(1, '11');

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 1          | 11         | 1          |
+------------+------------+------------+

Exemplo 4: Inserir uma linha com uma nova chave primária

Se a chave primária ainda não existir, o sistema insere uma nova linha.

INSERT INTO TABLE delta_target VALUES(2, '2', 2);

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 2          | 2          | 2          |
| 1          | 11         | 1          |
+------------+------------+------------+

Para obter mais informações, consulte Insert data into or overwrite data in a table or a static partition (INSERT INTO and INSERT OVERWRITE).

Atualizar colunas específicas em linhas existentes

Use UPDATE para modificar colunas específicas nas linhas correspondentes. As colunas não listadas na cláusula SET permanecem inalteradas.

Exemplo 1: Atualizar a coluna b para key=1, mantendo c inalterada

UPDATE delta_target SET b='111' WHERE key=1;

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 2          | 2          | 2          |
| 1          | 111        | 1          |
+------------+------------+------------+

Exemplo 2: Atualizar a coluna b para key=2, mantendo c inalterada

UPDATE delta_target SET b='222' WHERE key=2;

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 2          | 222        | 2          |
| 1          | 111        | 1          |
+------------+------------+------------+

Para obter mais informações, consulte UPDATE and DELETE.

Mesclar dados source em colunas específicas

Use MERGE INTO para fazer upsert de dados visando apenas colunas específicas. Na cláusula WHEN MATCHED, somente as colunas listadas são atualizadas; as demais permanecem inalteradas. Na cláusula WHEN NOT MATCHED, as colunas não listadas são definidas como NULL.

O exemplo a seguir cria uma tabela source e a mescla em delta_target. A mesclagem atualiza a coluna b para linhas correspondentes e insere (key, b) para novas linhas. A coluna c não é gravada em nenhum dos casos.

-- Create a source table with six rows
CREATE TABLE acid2_dml_pu_source AS
SELECT key, b, c
FROM VALUES
    (1, '10', 10),
    (2, '20', 20),
    (3, '30', 30),
    (4, '40', 40),
    (5, '50', 50),
    (6, '60', 60) t (key, b, c);

-- Merge: update b for matching rows, insert (key, b) for new rows
MERGE INTO delta_target AS t
USING acid2_dml_pu_source AS s ON s.key = t.key
WHEN MATCHED THEN
    UPDATE SET t.b = s.b
WHEN NOT MATCHED THEN
    INSERT (key, b) VALUES(s.key, s.b);

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 3          | 30         | NULL       |
| 4          | 40         | NULL       |
| 5          | 50         | NULL       |
| 6          | 60         | NULL       |
| 2          | 20         | 2          |
| 1          | 10         | 1          |
+------------+------------+------------+

As linhas 3–6 são novas inserções: a coluna c é NULL porque não foi especificada. As linhas 1 e 2 foram correspondidas: a coluna b foi atualizada e c manteve seu valor anterior.

Para obter mais informações, consulte MERGE INTO.

Próximos passos