

 Amazon Redshift tidak akan lagi mendukung pembuatan Python UDFs baru mulai Patch 198. Python yang ada UDFs akan terus berfungsi hingga 30 Juni 2026. Untuk informasi lebih lanjut, lihat [posting blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Memperbarui dan menyisipkan data baru
<a name="t_updating-inserting-using-staging-tables-"></a>

Anda dapat secara efisien menambahkan data baru ke tabel yang ada dengan menggunakan perintah MERGE. Lakukan operasi gabungan dengan membuat tabel pementasan dan kemudian menggunakan salah satu metode yang dijelaskan di bagian ini untuk memperbarui tabel target dari tabel pementasan. Untuk informasi selengkapnya tentang perintah MERGE, lihat[MERGE](r_MERGE.md).

[Gabungkan contoh](merge-examples.md)Penggunaan kumpulan data sampel untuk Amazon Redshift, yang disebut kumpulan data TICKIT. Sebagai prasyarat, Anda dapat mengatur tabel dan data TICKIT dengan mengikuti petunjuk yang tersedia di [Memulai](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html) tugas database umum. Informasi lebih rinci tentang kumpulan data sampel ditemukan di [database Sampel](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

## Gabungkan metode 1: Mengganti baris yang ada
<a name="merge-method-replace-existing-rows"></a>

Jika Anda menimpa semua kolom dalam tabel target, metode tercepat untuk melakukan penggabungan adalah dengan mengganti baris yang ada. Ini memindai tabel target hanya sekali, dengan menggunakan gabungan dalam untuk menghapus baris yang akan diperbarui. Setelah baris dihapus, mereka diganti dengan baris baru dengan operasi sisipan tunggal dari tabel pementasan. 

Gunakan metode ini jika semua hal berikut benar: 
+ Tabel target Anda dan tabel pementasan Anda berisi kolom yang sama. 
+ Anda bermaksud mengganti semua data di kolom tabel target dengan semua kolom tabel pementasan.
+ Anda akan menggunakan semua baris dalam tabel pementasan dalam penggabungan.

Jika salah satu kriteria ini tidak berlaku, gunakan metode Gabung 2: Menentukan daftar kolom tanpa menggunakan MERGE, dijelaskan di bagian berikut.

Jika Anda tidak akan menggunakan semua baris dalam tabel pementasan, filter pernyataan DELETE dan INSERT dengan menggunakan klausa WHERE untuk meninggalkan baris yang tidak berubah. Namun, jika sebagian besar baris dalam tabel pementasan tidak akan berpartisipasi dalam penggabungan, kami sarankan melakukan UPDATE dan INSERT dalam langkah-langkah terpisah, seperti yang dijelaskan nanti di bagian ini.

## Menggabungkan metode 2: Menentukan daftar kolom tanpa menggunakan MERGE
<a name="merge-method-specify-column-list"></a>

Gunakan metode ini untuk memperbarui kolom tertentu dalam tabel target alih-alih menimpa seluruh baris. Metode ini memakan waktu lebih lama dari metode sebelumnya karena memerlukan langkah pembaruan tambahan dan tidak menggunakan perintah MERGE. Gunakan metode ini jika salah satu dari berikut ini benar: 
+ Tidak semua kolom dalam tabel target akan diperbarui. 
+ Sebagian besar baris dalam tabel pementasan tidak akan digunakan dalam pembaruan. 

**Topics**
+ [Gabungkan metode 1: Mengganti baris yang ada](#merge-method-replace-existing-rows)
+ [Menggabungkan metode 2: Menentukan daftar kolom tanpa menggunakan MERGE](#merge-method-specify-column-list)
+ [Membuat tabel pementasan sementara](merge-create-staging-table.md)
+ [Melakukan operasi penggabungan dengan mengganti baris yang ada](merge-replacing-existing-rows.md)
+ [Melakukan operasi gabungan dengan menentukan daftar kolom tanpa menggunakan perintah MERGE](merge-specify-a-column-list.md)
+ [Gabungkan contoh](merge-examples.md)

# Membuat tabel pementasan sementara
<a name="merge-create-staging-table"></a>

*Tabel pementasan* adalah tabel sementara yang menyimpan semua data yang akan digunakan untuk membuat perubahan pada *tabel target*, termasuk pembaruan dan sisipan. 

Operasi penggabungan membutuhkan gabungan antara tabel pementasan dan tabel target. Untuk mengurutkan baris yang bergabung, atur kunci distribusi tabel pementasan ke kolom yang sama dengan kunci distribusi tabel target. Misalnya, jika tabel target menggunakan kolom kunci asing sebagai kunci distribusinya, gunakan kolom yang sama untuk kunci distribusi tabel pementasan. Jika Anda membuat tabel pementasan dengan menggunakan [CREATE TABLE LIKE](r_CREATE_TABLE_NEW.md#create-table-like) pernyataan, tabel pementasan akan mewarisi kunci distribusi dari tabel induk. Jika Anda menggunakan pernyataan CREATE TABLE AS, tabel baru tidak mewarisi kunci distribusi. Untuk informasi selengkapnya, lihat [Distribusi data untuk optimasi kueri](t_Distributing_data.md)

Jika kunci distribusi tidak sama dengan kunci utama dan kunci distribusi tidak diperbarui sebagai bagian dari operasi penggabungan, tambahkan predikat gabungan redundan pada kolom kunci distribusi untuk mengaktifkan gabungan yang ditempatkan. Contoh: 

```
where target.primarykey = stage.primarykey 
and target.distkey = stage.distkey
```

Untuk memverifikasi bahwa kueri akan menggunakan gabungan yang ditempatkan, jalankan kueri dengan [EXPLAIN](r_EXPLAIN.md) dan periksa DS\$1DIST\$1NONE pada semua gabungan. Untuk informasi selengkapnya, lihat [Mengevaluasi rencana kueri](c_data_redistribution.md)

# Melakukan operasi penggabungan dengan mengganti baris yang ada
<a name="merge-replacing-existing-rows"></a>

Saat Anda menjalankan operasi penggabungan yang dirinci dalam prosedur, letakkan semua langkah kecuali untuk membuat dan menjatuhkan tabel pementasan sementara dalam satu transaksi. Transaksi bergulir kembali jika ada langkah yang gagal. Menggunakan satu transaksi juga mengurangi jumlah komit, yang menghemat waktu dan sumber daya.

**Untuk melakukan operasi penggabungan dengan mengganti baris yang ada**

1. Buat tabel pementasan, lalu isi dengan data yang akan digabungkan, seperti yang ditunjukkan pada pseudocode berikut.

   ```
   CREATE temp table stage (like target); 
   
   INSERT INTO stage 
   SELECT * FROM source 
   WHERE source.filter = 'filter_expression';
   ```

1.  Gunakan MERGE untuk melakukan penggabungan batin dengan tabel pementasan untuk memperbarui baris dari tabel target yang cocok dengan tabel pementasan, lalu masukkan semua baris yang tersisa ke dalam tabel target yang tidak cocok dengan tabel pementasan.

    Kami menyarankan Anda menjalankan pembaruan dan menyisipkan operasi dalam satu perintah MERGE.

   ```
   MERGE INTO target 
   USING stage [optional alias] on (target.primary_key = stage.primary_key)
   WHEN MATCHED THEN 
   UPDATE SET col_name1 = stage.col_name1 , col_name2= stage.col_name2, col_name3 = {expr}
   WHEN NOT MATCHED THEN
   INSERT (col_name1 , col_name2, col_name3) VALUES (stage.col_name1, stage.col_name2, {expr});
   ```

1. Jatuhkan meja pementasan. 

   ```
   DROP TABLE stage;
   ```

# Melakukan operasi gabungan dengan menentukan daftar kolom tanpa menggunakan perintah MERGE
<a name="merge-specify-a-column-list"></a>

Saat Anda menjalankan operasi penggabungan yang dirinci dalam prosedur, masukkan semua langkah dalam satu transaksi. Transaksi bergulir kembali jika ada langkah yang gagal. Menggunakan satu transaksi juga mengurangi jumlah komit, yang menghemat waktu dan sumber daya.

**Untuk melakukan operasi gabungan dengan menentukan daftar kolom**

1. Letakkan seluruh operasi dalam satu blok transaksi. 

   ```
   BEGIN transaction;
   … 
   END transaction;
   ```

1. Buat tabel pementasan, lalu isi dengan data yang akan digabungkan, seperti yang ditunjukkan pada pseudocode berikut. 

   ```
   create temp table stage (like target); 
   insert into stage 
   select * from source 
   where source.filter = 'filter_expression';
   ```

1. Perbarui tabel target dengan menggunakan gabungan bagian dalam dengan tabel pementasan. 
   + Dalam klausa UPDATE, secara eksplisit daftar kolom yang akan diperbarui. 
   + Lakukan gabungan batin dengan tabel pementasan. 
   + Jika kunci distribusi berbeda dari kunci utama dan kunci distribusi tidak diperbarui, tambahkan gabungan redundan pada kunci distribusi. Untuk memverifikasi bahwa kueri akan menggunakan gabungan yang ditempatkan, jalankan kueri dengan [EXPLAIN](r_EXPLAIN.md) dan periksa DS\$1DIST\$1NONE pada semua gabungan. Untuk informasi selengkapnya, lihat [Mengevaluasi rencana kueri](c_data_redistribution.md)
   + Jika tabel target Anda diurutkan berdasarkan stempel waktu, tambahkan predikat untuk memanfaatkan pemindaian terbatas rentang pada tabel target. Untuk informasi selengkapnya, lihat [Praktik terbaik Amazon Redshift untuk mendesain kueri](c_designing-queries-best-practices.md).
   + Jika Anda tidak akan menggunakan semua baris dalam penggabungan, tambahkan klausa untuk memfilter baris yang ingin Anda ubah. Misalnya, tambahkan filter ketidaksetaraan pada satu atau beberapa kolom untuk mengecualikan baris yang belum berubah.
   + Masukkan pembaruan, hapus, dan sisipkan operasi dalam satu blok transaksi sehingga jika ada masalah, semuanya akan dibatalkan.

    Contoh: 

   ```
   begin transaction;
   
   update target 
   set col1 = stage.col1, 
   col2 = stage.col2, 
   col3 = 'expression' 
   from stage 
   where target.primarykey = stage.primarykey 
   and target.distkey = stage.distkey 
   and target.col3 > 'last_update_time' 
   and (target.col1 != stage.col1 
   or target.col2 != stage.col2 
   or target.col3 = 'filter_expression');
   ```

1. Hapus baris yang tidak dibutuhkan dari tabel pementasan dengan menggunakan gabungan batin dengan tabel target. Beberapa baris di tabel target sudah cocok dengan baris yang sesuai di tabel pementasan, dan lainnya diperbarui pada langkah sebelumnya. Dalam kedua kasus, mereka tidak diperlukan untuk sisipan. 

   ```
   delete from stage 
   using target 
   where stage.primarykey = target.primarykey;
   ```

1. Masukkan baris yang tersisa dari tabel pementasan. Gunakan daftar kolom yang sama dalam klausa VALUES yang Anda gunakan dalam pernyataan UPDATE di langkah kedua. 

   ```
   insert into target
   (select col1, col2, 'expression'
   from stage);
   
   end transaction;
   ```

1. Jatuhkan meja pementasan. 

   ```
   drop table stage;
   ```

# Gabungkan contoh
<a name="merge-examples"></a>

Contoh berikut melakukan penggabungan untuk memperbarui tabel PENJUALAN. Contoh pertama menggunakan metode sederhana menghapus dari tabel target dan kemudian memasukkan semua baris dari tabel pementasan. Contoh kedua memerlukan pembaruan pada kolom tertentu di tabel target, sehingga termasuk langkah pembaruan tambahan. 

[Gabungkan contoh](#merge-examples)Penggunaan kumpulan data sampel untuk Amazon Redshift, yang disebut kumpulan data TICKIT. Sebagai prasyarat, Anda dapat mengatur tabel dan data TICKIT dengan mengikuti petunjuk yang tersedia di panduan [Memulai](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html) tugas basis data umum. Informasi lebih rinci tentang kumpulan data sampel ditemukan di [database Sampel](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

**Contoh menggabungkan sumber data**

Contoh di bagian ini memerlukan sumber data sampel yang mencakup pembaruan dan sisipan. Sebagai contoh, kita akan membuat tabel sampel bernama SALES\$1UPDATE yang menggunakan data dari tabel SALES. Kami akan mengisi tabel baru dengan data acak yang mewakili aktivitas penjualan baru untuk bulan Desember. Kami akan menggunakan tabel sampel SALES\$1UPDATE untuk membuat tabel pementasan dalam contoh berikut. 

```
-- Create a sample table as a copy of the SALES table.

create table tickit.sales_update as
select * from tickit.sales;

-- Change every fifth row to have updates.

update tickit.sales_update
set qtysold = qtysold*2,
pricepaid = pricepaid*0.8,
commission = commission*1.1
where saletime > '2008-11-30'
and mod(sellerid, 5) = 0;

-- Add some new rows to have inserts.
-- This example creates a duplicate of every fourth row.

insert into tickit.sales_update
select (salesid + 172456) as salesid, listid, sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, getdate() as saletime
from tickit.sales_update
where saletime > '2008-11-30'
and mod(sellerid, 4) = 0;
```

**Contoh penggabungan yang menggantikan baris yang ada berdasarkan kunci yang cocok**

Skrip berikut menggunakan tabel SALES\$1UPDATE untuk melakukan operasi gabungan pada tabel PENJUALAN dengan data baru untuk aktivitas penjualan Desember. Contoh ini menggantikan baris dalam tabel PENJUALAN yang memiliki pembaruan. Untuk contoh ini, kami akan memperbarui kolom qtysold dan pricepaid, tetapi membiarkan komisi dan waktu penjualan tidak berubah.

```
MERGE into tickit.sales 
USING tickit.sales_update sales_update  
on ( sales.salesid = sales_update.salesid
and sales.listid = sales_update.listid
and sales_update.saletime > '2008-11-30'
and (sales.qtysold != sales_update.qtysold 
or sales.pricepaid != sales_update.pricepaid))
WHEN MATCHED THEN
update SET qtysold = sales_update.qtysold,
pricepaid = sales_update.pricepaid
WHEN NOT MATCHED THEN 
INSERT (salesid, listid, sellerid, buyerid, eventid, dateid, qtysold , pricepaid, commission, saletime)
values (sales_update.salesid, sales_update.listid, sales_update.sellerid, sales_update.buyerid, sales_update.eventid, 
sales_update.dateid, sales_update.qtysold , sales_update.pricepaid, sales_update.commission, sales_update.saletime);

-- Drop the staging table.
drop table tickit.sales_update;

-- Test to see that commission and salestime were not impacted.
SELECT sales.salesid, sales.commission, sales.salestime, sales_update.commission, sales_update.salestime 
FROM tickit.sales 
INNER JOIN tickit.sales_update sales_update  
ON 
sales.salesid = sales_update.salesid
AND sales.listid = sales_update.listid
AND sales_update.saletime > '2008-11-30'
AND (sales.commission != sales_update.commission 
OR sales.salestime != sales_update.salestime);
```

**Contoh gabungan yang menentukan daftar kolom tanpa menggunakan MERGE**

Contoh berikut melakukan operasi penggabungan untuk memperbarui PENJUALAN dengan data baru untuk aktivitas penjualan Desember. Kami membutuhkan data sampel yang mencakup pembaruan dan sisipan, bersama dengan baris yang tidak berubah. Untuk contoh ini, kami ingin memperbarui kolom QTYSOLD dan PRICEPAID tetapi membiarkan KOMISI dan SALETIME tidak berubah. Skrip berikut menggunakan tabel SALES\$1UPDATE untuk melakukan operasi gabungan pada tabel PENJUALAN. 

```
-- Create a staging table and populate it with rows from SALES_UPDATE for Dec
create temp table stagesales as select * from sales_update
where saletime > '2008-11-30';

-- Start a new transaction
begin transaction;

-- Update the target table using an inner join with the staging table
-- The join includes a redundant predicate to collocate on the distribution key –- A filter on saletime enables a range-restricted scan on SALES

update sales
set qtysold = stagesales.qtysold,
pricepaid = stagesales.pricepaid
from stagesales
where sales.salesid = stagesales.salesid
and sales.listid = stagesales.listid
and stagesales.saletime > '2008-11-30'
and (sales.qtysold != stagesales.qtysold 
or sales.pricepaid != stagesales.pricepaid);
 
-- Delete matching rows from the staging table 
-- using an inner join with the target table

delete from stagesales
using sales
where sales.salesid = stagesales.salesid
and sales.listid = stagesales.listid;

-- Insert the remaining rows from the staging table into the target table
insert into sales
select * from stagesales;

-- End transaction and commit
end transaction;

-- Drop the staging table
drop table stagesales;
```