All Products
Search
Document Center

MaxCompute:Tabel PK - Perbarui data di kolom tertentu

Last Updated:Sep 02, 2026

Menulis ke tabel lebar secara kolom per kolom mahal jika setiap operasi INSERT atau UPDATE harus menentukan semua kolom. Pembaruan kolom parsial mengatasi kendala tersebut: cukup tentukan kolom yang ingin diubah, dan MaxCompute akan menangani sisanya secara otomatis berdasarkan jenis operasinya.

Cara kerja

Perilaku untuk kolom yang tidak ditentukan bergantung pada jenis operasi:

Operation

Unspecified columns

INSERT INTO / INSERT OVERWRITE

Set to NULL

UPDATE

Left unchanged

MERGE INTO (WHEN MATCHED UPDATE SET)

Left unchanged

MERGE INTO (WHEN NOT MATCHED INSERT)

Set to NULL

Perbedaan utama yang perlu dipahami adalah: INSERT mengisi kolom yang tidak disebutkan dengan NULL, sedangkan UPDATE dan WHEN MATCHED membiarkannya tetap tidak berubah.

Kasus penggunaan

Kasus penggunaan paling umum adalah membangun tabel lebar dari skema bintang. Ketika beberapa tabel sumber berbagi primary key yang sama, kolom masing-masing tabel sumber dapat ditulis ke tabel lebar secara independen dan paralel. Saat dibaca, MaxCompute menggabungkan baris berdasarkan primary key dan mengembalikan catatan lengkap. Pendekatan ini meningkatkan performa penulisan dan pembacaan serta mengurangi biaya penyimpanan dibandingkan dengan menulis semua kolom dalam satu operasi.

Prasyarat

Sebelum memulai, pastikan Anda telah:

  • Tabel Delta dengan pembaruan kolom parsial yang diaktifkan (lihat Buat tabel Delta)

  • Memahami pernyataan DML MaxCompute: INSERT INTO, UPDATE, DELETE, dan MERGE INTO

Create a Delta table

Untuk mengaktifkan partial column update, atur dua properti tabel berikut saat membuat tabel:

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

Kedua properti acid.partial.fields.update.enable dan transactional harus diatur ke "true". Fitur ini mendukung baik tabel partisi maupun non-partisi.

Insert data into specific columns

Gunakan INSERT INTO untuk menulis nilai ke subset kolom. Kolom yang tidak tercantum dalam daftar kolom akan diatur ke NULL. Jika Anda memasukkan baris dengan primary key yang sudah ada, MaxCompute hanya memperbarui kolom yang ditentukan dan membiarkan kolom lainnya tidak berubah—ini secara efektif merupakan pembaruan parsial melalui insert.

Contoh 1: Masukkan baris baru, mengabaikan kolom `c`

Kolom c tidak tercantum, sehingga diatur ke NULL.

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

SELECT * FROM delta_target;

Hasil:

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

Contoh 2: Masukkan baris dengan primary key duplikat untuk memperbarui kolom tertentu

Baris dengan key=1 sudah ada. Memasukkan baris dengan primary key yang sama memperbarui kolom yang ditentukan (c) dan membiarkan kolom yang tidak ditentukan (b) tetap tidak berubah.

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

SELECT * FROM delta_target;

Hasil:

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

Contoh 3: Perbarui kolom lain sambil mempertahankan nilai `c`

Kolom c tidak tercantum, sehingga mempertahankan nilai saat ini yaitu 1.

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

SELECT * FROM delta_target;

Hasil:

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

Contoh 4: Masukkan baris dengan primary key baru

Jika primary key belum ada, baris baru akan dimasukkan.

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

SELECT * FROM delta_target;

Hasil:

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

Untuk informasi lebih lanjut, lihat Insert data into or overwrite data in a table or a static partition (INSERT INTO and INSERT OVERWRITE).

Update specific columns in existing rows

Gunakan UPDATE untuk mengubah kolom tertentu pada baris yang sesuai. Kolom yang tidak tercantum dalam klausa SET dibiarkan tidak berubah.

Contoh 1: Perbarui kolom `b` untuk `key=1`, biarkan `c` tidak berubah

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

SELECT * FROM delta_target;

Hasil:

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

Contoh 2: Perbarui kolom `b` untuk `key=2`, biarkan `c` tidak berubah

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

SELECT * FROM delta_target;

Hasil:

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

Untuk informasi lebih lanjut, lihat UPDATE and DELETE.

Merge source data into specific columns

Gunakan MERGE INTO untuk melakukan upsert data sambil hanya menargetkan kolom tertentu. Dalam klausa WHEN MATCHED, hanya kolom yang tercantum yang diperbarui; kolom lainnya dibiarkan tidak berubah. Dalam klausa WHEN NOT MATCHED, kolom yang tidak tercantum diatur ke NULL.

Contoh berikut membuat tabel sumber dan menggabungkannya ke delta_target. Penggabungan ini memperbarui kolom b untuk baris yang cocok dan memasukkan (key, b) untuk baris baru—kolom c tidak ditulis dalam kedua kasus tersebut.

-- 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);

Hasil:

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

Baris 3–6 merupakan insert baru: kolom c bernilai NULL karena tidak ditentukan. Baris 1 dan 2 cocok: kolom b diperbarui dan c mempertahankan nilai sebelumnya.

Untuk informasi lebih lanjut, lihat MERGE INTO.

What's next