

 Amazon Redshift unterstützt UDFs ab Patch 198 nicht mehr die Erstellung von neuem Python. Das bestehende Python UDFs wird bis zum 30. Juni 2026 weiterhin funktionieren. Weitere Informationen finden Sie im [Blog-Posting](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Laden von Tabellen mit DML-Befehlen
<a name="t_Updating_tables_with_DML_commands"></a>

Amazon Redshift unterstützt Data Manipulation Language (DML)-Standardbefehle (INSERT, UPDATE und DELETE), die Sie verwenden können, um Zeilen in Tabellen zu modifizieren. Sie können auch den Befehl TRUNCATE verwenden, um schnell eine große Zahl von Löschvorgängen auszuführen.

**Anmerkung**  
Es wird nachdrücklich empfohlen, den Befehl [COPY](r_COPY.md) zu verwenden, um große Mengen von Daten zu laden. Die Verwendung einzelner INSERT-Anweisungen, um eine Tabelle auszufüllen, kann äußerst langsam sein. Wenn Ihre Daten in anderen Amazon-Redshift-Datenbanktabellen bereits vorhanden sind, können Sie alternativ den Befehl INSERT INTO ... verwenden. SELECT FROM oder CREATE TABLE AS verwenden, um die Leistung zu verbessern. Weitere Informationen finden Sie unter [INSERT](r_INSERT_30.md) oder [CREATE TABLE AS](r_CREATE_TABLE_AS.md).

Wenn Sie im Vergleich zur Anzahl der Zeilen vor den Änderungen eine große Zahl von Zeilen in einer Tabelle einfügen, aktualisieren oder löschen, führen Sie für die Tabelle die Befehle ANALYZE und VACUUM aus, wenn Sie fertig sind. Wenn sich über die Zeit kleinere Änderungen in Ihrer Anwendung ansammeln, sollten Sie für die Befehle ANALYZE und VACUUM eine Ausführung in regelmäßigen Abständen planen. Weitere Informationen erhalten Sie unter [Analysieren von Tabellen](t_Analyzing_tables.md) und [Bereinigen von Tabellen](t_Reclaiming_storage_space202.md).

**Topics**
+ [Aktualisieren von Daten und Einfügen neuer Daten](t_updating-inserting-using-staging-tables-.md)

# Aktualisieren von Daten und Einfügen neuer Daten
<a name="t_updating-inserting-using-staging-tables-"></a>

Mit dem Befehl MERGE können Sie einer vorhandenen Tabelle effizient neue Daten hinzufügen. Führen Sie einen Zusammenführungsvorgang durch, indem Sie eine Staging-Tabelle erstellen und dann eine der in diesem Abschnitt beschriebenen Methoden verwenden, um die Zieltabelle aus der Staging-Tabelle zu aktualisieren. Weitere Informationen zum MERGE-Befehl finden Sie unter [MERGE](r_MERGE.md).

In [Beispiele für Zusammenführungen](merge-examples.md) wird ein Beispieldatensatz für Amazon Redshift verwendet, der sogenannte TICKIT-Datensatz. Als Voraussetzung können Sie die TICKIT-Tabellen und -Daten einrichten, indem Sie den Anweisungen unter [Erste Schritte mit gängigen Datenbankaufgaben](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html) folgen. Weitere Informationen zum Beispieldatensatz finden Sie unter [Beispieldatenbank](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

## Zusammenführungsmethode 1: Ersetzung vorhandener Zeilen
<a name="merge-method-replace-existing-rows"></a>

Wenn Sie alle Spalten in der Zieltabelle überschreiben, besteht die schnellste Methode der Zusammenführung darin, die vorhandenen Zeilen zu ersetzen. Bei dieser Methode wird die Zieltabelle nur einmal gescannt. Dabei wird ein innerer Join verwendet, um Zeilen zu löschen, die aktualisiert werden. Nach dem Löschen werden die Zeilen in einer einzigen Einfügungsoperation basierend auf der Staging-Tabelle durch neue Zeilen ersetzt. 

Verwenden Sie diese Methode, wenn alle folgenden Bedingungen zutreffen: 
+ Zieltabelle und Staging-Tabelle enthalten dieselben Spalten. 
+ Sie möchten alle Daten in den Spalten der Zieltabelle durch alle Spalten der Staging-Tabelle ersetzen.
+ Sie verwenden alle Zeilen in der Staging-Tabelle bei der Zusammenführung.

Wenn eines dieser Kriterien nicht zutrifft, verwenden Sie die Zusammenführungsmethode 2: Angabe einer Spaltenliste ohne den Befehl MERGE, wie im folgenden Abschnitt beschrieben.

Wenn Sie nicht alle Zeilen in der Staging-Tabelle verwenden, filtern Sie die Anweisungen DELETE und INSERT mittels einer WHERE-Klausel, um Zeilen auszulassen, die nicht geändert werden. Wenn jedoch die meisten Zeilen in der Staging-Tabelle nicht an der Zusammenführung beteiligt sind, wird die Ausführung einer UPDATE- und INSERT-Operation in getrennten Schritte empfohlen wie später in diesem Abschnitt beschrieben.

## Zusammenführungsmethode 2: Angabe einer Spaltenliste ohne den Befehl MERGE
<a name="merge-method-specify-column-list"></a>

Verwenden Sie diese Methode, um spezifische Spalten in der Zieltabelle zu aktualisieren, statt ganze Zeilen zu überschreiben. Diese Methode dauert länger als die vorherige Methode, da sie einen zusätzlichen Update-Schritt erfordert und den Befehl MERGE nicht nutzt. Verwenden Sie diese Methode, wenn eine der folgenden Bedingungen zutrifft: 
+ Es müssen nicht alle Spalten in der Zieltabelle aktualisiert werden. 
+ Die meisten Zeilen in der Staging-Tabelle werden nicht für Aktualisierung verwendet. 

**Topics**
+ [Zusammenführungsmethode 1: Ersetzung vorhandener Zeilen](#merge-method-replace-existing-rows)
+ [Zusammenführungsmethode 2: Angabe einer Spaltenliste ohne den Befehl MERGE](#merge-method-specify-column-list)
+ [Erstellen einer temporären Staging-Tabelle](merge-create-staging-table.md)
+ [Ausführen einer Zusammenführungsoperation durch Ersetzung vorhandener Zeilen](merge-replacing-existing-rows.md)
+ [Ausführen einer Zusammenführungsoperation durch Angabe einer Spaltenliste ohne den Befehl MERGE](merge-specify-a-column-list.md)
+ [Beispiele für Zusammenführungen](merge-examples.md)

# Erstellen einer temporären Staging-Tabelle
<a name="merge-create-staging-table"></a>

Die *Staging-Tabelle* ist eine temporäre Tabelle, die alle Daten enthält, die für Änderungen der *Zieltabelle* verwendet werden, einschließlich Aktualisierungen und Einfügungen. 

Eine Zusammenführungsoperation erfordert einen Join zwischen der Staging-Tabelle und der Zieltabelle. Um die Join-Zeilen zusammenzufassen, legen Sie den Verteilungsschlüssel der Staging-Tabelle auf dieselbe Spalte wie den Verteilungsschlüssel der Zieltabelle fest. Wenn die Zieltabelle beispielsweise eine Fremdschlüsselspalte als Verteilungsschlüssel verwendet, verwenden Sie dieselbe Spalte für den Verteilungsschlüssel der Staging-Tabelle. Wenn Sie die Staging-Tabelle mittels einer [CREATE TABLE LIKE](r_CREATE_TABLE_NEW.md#create-table-like)-Anweisung erstellen, erbt die Staging-Tabelle den Verteilungsschlüssel aus der übergeordneten Tabelle. Wenn Sie eine CREATE TABLE AS-Anweisung verwenden, erbt die neue Tabelle den Verteilungsschlüssel nicht. Weitere Informationen finden Sie unter [Datenverteilung zur Abfrageoptimierung](t_Distributing_data.md)

Wenn der Verteilungsschlüssel nicht mit dem primären Schlüssel identisch ist und der Verteilungsschlüssel im Rahmen der Zusammenführungsoperation nicht aktualisiert wird, fügen Sie für die Verteilungsschlüsselspalten ein redundantes Join-Prädikat hinzu, um einen zusammengefassten Join zu ermöglichen. Beispiel: 

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

Um zu überprüfen, ob die Abfrage einen zusammengefassten Join verwendet, führen Sie die Abfrage mit [EXPLAIN](r_EXPLAIN.md) aus und suchen für alle Joins nach DS\$1DIST\$1NONE. Weitere Informationen finden Sie unter [Auswerten des Abfrageplans](c_data_redistribution.md)

# Ausführen einer Zusammenführungsoperation durch Ersetzung vorhandener Zeilen
<a name="merge-replacing-existing-rows"></a>

Wenn Sie die im Verfahren beschriebene Zusammenführungsoperation ausführen, führen Sie alle Schritte abgesehen vom Erstellen und Entfernen der temporären Staging-Tabelle in einer einzigen Transaktion aus. Die Transaktion wird rückgängig gemacht, falls ein Schritt fehlschlägt. Die Verwendung einer einzelnen Transaktion reduziert auch die Anzahl der Commit-Vorgänge, was Zeit und Ressourcen spart.

**So führen Sie eine Zusammenführungsoperation durch Ersetzung vorhandener Zeilen aus**

1. Erstellen Sie eine Staging-Tabelle und füllen Sie sie mit Daten aus, die zusammengeführt werden sollen, wie im folgenden Pseudocode gezeigt.

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

1.  Verwenden Sie MERGE, um einen Inner Join mit der Staging-Tabelle durchzuführen und die Zeilen aus der Zieltabelle zu aktualisieren, die der Staging-Tabelle entsprechen. Fügen Sie dann alle verbleibenden Zeilen in die Zieltabelle ein, die nicht mit der Staging-Tabelle übereinstimmen.

    Wir empfehlen, die Aktualisierungs- und Einfügevorgänge in einem einzigen MERGE-Befehl auszuführen.

   ```
   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. Entfernen Sie die Staging-Tabelle. 

   ```
   DROP TABLE stage;
   ```

# Ausführen einer Zusammenführungsoperation durch Angabe einer Spaltenliste ohne den Befehl MERGE
<a name="merge-specify-a-column-list"></a>

Wenn Sie die im Verfahren beschriebene Zusammenführungsoperation ausführen, führen Sie alle Schritte in einer einzigen Transaktion aus. Die Transaktion wird rückgängig gemacht, falls ein Schritt fehlschlägt. Die Verwendung einer einzelnen Transaktion reduziert auch die Anzahl der Commit-Vorgänge, was Zeit und Ressourcen spart.

**So führen Sie eine Zusammenführungsoperation durch Angabe einer Spaltenliste aus**

1. Platzieren Sie die gesamte Operation in einen einzigen Transaktionsblock. 

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

1. Erstellen Sie eine Staging-Tabelle und füllen Sie sie mit Daten aus, die zusammengeführt werden sollen, wie im folgenden Pseudocode gezeigt. 

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

1. Aktualisieren Sie die Zieltabelle mittels eines internen Joins mit der Staging-Tabelle. 
   + Listen Sie in der UPDATE-Klausel explizit die Spalten auf, die aktualisiert werden sollen. 
   + Führen Sie einen internen Join mit der Staging-Tabelle aus. 
   + Wenn sich der Verteilungsschlüssel vom primären Schlüssel unterscheidet und der Verteilungsschlüssel nicht aktualisiert wird, fügen Sie für den Verteilungsschlüssel einen redundanten Join hinzu. Um zu überprüfen, ob die Abfrage einen zusammengefassten Join verwendet, führen Sie die Abfrage mit [EXPLAIN](r_EXPLAIN.md) aus und suchen für alle Joins nach DS\$1DIST\$1NONE. Weitere Informationen finden Sie unter [Auswerten des Abfrageplans](c_data_redistribution.md)
   + Wenn Ihre Zieltabelle nach Zeitstempel sortiert ist, fügen Sie ein Prädikat hinzu, um Scans mit eingeschränkten Bereichen für die Zieltabelle zu nutzen. Weitere Informationen finden Sie unter [Bewährte Methoden für die Gestaltung von Abfragen mit Amazon Redshift](c_designing-queries-best-practices.md).
   + Wenn Sie nicht alle Zeilen in der Zusammenführung verwenden, fügen Sie eine Klausel hinzu, um die Zeilen herauszufiltern, die Sie ändern möchten. Sie können beispielsweise einen Ungleichheitsfilter zu einer oder mehreren Zeilen hinzufügen, um Zeilen auszuschließen, die nicht geändert wurden.
   + Platzieren Sie die Operationen zum Aktualisieren, Löschen und Einfügen in einem einzigen Transaktionsblock, damit ein Rollback ausgeführt werden kann, wenn es Probleme gibt.

    Beispiel: 

   ```
   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. Löschen Sie nicht benötigte Zeilen aus der Staging-Tabelle, indem Sie einen internen Join mit der Zieltabelle verwenden. Einige Zeilen in der Zieltabelle stimmen bereits mit den entsprechenden Zeilen in der Staging-Tabelle überein. Andere Zeilen wurden im vorherigen Schritt aktualisiert. In beiden Fällen werden diese Zeilen für die Einfügungsoperation nicht benötigt. 

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

1. Fügen Sie die verbleibenden Zeilen aus der Staging-Tabelle ein. Verwenden Sie hierfür dieselbe Spaltenliste in der VALUES-Klausel, die Sie in Schritt zwei in der UPDATE-Anweisung verwendet haben. 

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

1. Entfernen Sie die Staging-Tabelle. 

   ```
   drop table stage;
   ```

# Beispiele für Zusammenführungen
<a name="merge-examples"></a>

In den folgenden Beispielen werden Zusammenführungen ausgeführt, um die Tabelle SALES zu aktualisieren. Im ersten Beispiel wird die einfachere Methode verwendet, bei der alle Zeilen in der Zieltabelle gelöscht werden und anschließend alle Zeilen aus der Staging-Tabelle eingefügt werden. Im zweiten Beispiel müssen ausgewählte Spalten in der Zieltabelle aktualisiert werden. Daher enthält es einen zusätzlichen Aktualisierungsschritt. 

In [Beispiele für Zusammenführungen](#merge-examples) wird ein Beispieldatensatz für Amazon Redshift verwendet, der sogenannte TICKIT-Datensatz. Als Voraussetzung können Sie die TICKIT-Tabellen und -Daten einrichten, indem Sie den Anweisungen in der Anleitung [Erste Schritte mit gängigen Datenbankaufgaben](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html) folgen. Weitere Informationen zum Beispieldatensatz finden Sie unter [Beispieldatenbank](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

**Beispieldatenquelle für eine Zusammenführung**

Die Beispiele in diesem Abschnitt benötigen eine Beispieldatenquelle, die sowohl Aktualisierungen als auch Einfügungen enthält. Zu diesem Zweck wird eine Beispieltabelle namens SALES\$1UPDATE erstellt, die Daten aus der Tabelle SALES verwendet. Die neue Tabelle wird mit zufälligen Daten ausgefüllt, die neue Vertriebsaktivitäten für den Dezember darstellen. Die Beispieltabelle SALES\$1UPDATE wird verwendet, um die Staging-Tabelle in den folgenden Beispielen zu erstellen. 

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

**Beispiel für eine Zusammenführung, bei der vorhandene Zeilen basierend auf übereinstimmenden Schlüsseln ersetzt werden**

Im folgenden Skript wird die Tabelle SALES\$1UPDATE verwendet, um für die Tabelle SALES eine Zusammenführungsoperation mit neuen Daten für Vertriebsaktivitäten im Dezember auszuführen. In diesem Beispiel werden Zeilen in der SALES-Tabelle ersetzt, die aktualisiert wurden. In diesem Beispiel aktualisieren wir die Spalten QTYSOLD und PRICEPAID. Die Spalten COMMISSION und SALETIME bleiben unverändert.

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

**Beispiel für eine Zusammenführung, bei der eine Spaltenliste angegeben wird, ohne den Befehl MERGE zu verwenden**

Im folgenden Beispiel wird eine Zusammenführungsoperation ausgeführt, um SALES durch neue Daten für Vertriebsaktivitäten im Dezember zu aktualisieren. Die Beispieldaten müssen sowohl Aktualisierungen als auch Einfügungen sowie nicht geänderte Zeilen enthalten. In diesem Beispiel sollen die Spalten QTYSOLD und PRICEPAID aktualisiert werden. Die Spalten COMMISSION und SALETIME sollen dagegen nicht verändert werden. Im folgenden Skript wird die Tabelle SALES\$1UPDATE verwendet, um für die Tabelle SALES eine Zusammenführungsoperation auszuführen. 

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