

 O Amazon Redshift não permitirá mais a criação de UDFs do Python a partir do Patch 198. As UDFs do Python existentes continuarão a funcionar normalmente até 30 de junho de 2026. Para ter mais informações, consulte a [publicação de blog ](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

# Carregar tabelas com comandos DML
<a name="t_Updating_tables_with_DML_commands"></a>

O Amazon Redshift oferece suporte a comandos de linguagem de manipulação de dados (DML) padrão (INSERT, UPDATE e DELETE) que você pode usar para modificar linhas em tabelas. Você também pode usar o comando TRUNCATE para fazer exclusões em massa rápidas.

**nota**  
Recomendamos veementemente o uso do comando [COPY](r_COPY.md) para carregar grandes quantidades de dados. O uso de instruções INSERT individuais para povoar uma tabela pode ser proibitivamente lento. Como alternativa, se seus dados já existem em outras tabelas de banco de dados do Amazon Redshift, use INSERT INTO... SELECT FROM ou CREATE TABLE AS para aprimorar a performance. Para obter informações, consulte [INSERT](r_INSERT_30.md) ou [CREATE TABLE AS](r_CREATE_TABLE_AS.md).

Se você inserir dados, atualizar ou excluir um número significativo de linhas de uma tabela em relação ao número de linhas antes das alterações, execute os comandos ANALYZE e VACUUM na tabela quando você tiver terminado. Se um número de pequenas alterações se acumula ao longo do tempo em seu aplicativo, você pode querer agendar a execução dos comandos ANALYZE e VACUUM em intervalos regulares. Para obter mais informações, consulte [Análise de tabelas](t_Analyzing_tables.md) e [Vacuum de tabelas](t_Reclaiming_storage_space202.md).

**Topics**
+ [Atualização e inserção de novos dados](t_updating-inserting-using-staging-tables-.md)

# Atualização e inserção de novos dados
<a name="t_updating-inserting-using-staging-tables-"></a>

É possível adicionar novos dados de forma eficiente a uma tabela existente usando o comando MERGE. Execute uma operação de mesclagem criando uma tabela intermediária e, depois, use um dos métodos descritos nesta seção para atualizar a tabela de destino pela tabela de preparação. Para obter mais informações sobre o comando MERGE, consulte [MERGE](r_MERGE.md).

O [Exemplos de mesclagem](merge-examples.md) usa um exemplo de conjunto de dados para o Amazon Redshift, chamado conjunto de dados TICKIT. Como pré-requisito, você pode configurar as tabelas e os dados do TICKIT seguindo as instruções disponíveis em [Conceitos básicos das tarefas comuns do banco de dados](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html). Informações mais detalhadas sobre o exemplo de conjunto de dados estão disponíveis em [Exemplo de banco de dados](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

## Método de mesclagem 1: substituição de linhas existentes
<a name="merge-method-replace-existing-rows"></a>

Se você estiver sobrescrevendo todas as colunas na tabela de destino, o método mais rápido para realizar uma mesclagem será substituir as linhas existentes. Isso verifica a tabela de destino apenas uma vez, usando uma junção interna para excluir as linhas que serão atualizadas. Após a exclusão das linhas, elas são substituídas por novas linhas por uma única operação de inserção da tabela de preparação. 

Use este método se todos os itens a seguir forem verdadeiros: 
+ Sua tabela de destino e sua tabela de preparação contêm as mesmas colunas. 
+ Você pretende substituir todos os dados nas colunas da tabela de destino por todas as colunas da tabela de preparação.
+ Você utilizará todas as linhas da tabela de preparação na mesclagem.

Se qualquer um desses critérios não se aplicar, use o “Método de mesclagem 2: especificação de uma lista de colunas sem usar MERGE”, descrito na seção a seguir.

Se você não vai usar todas as linhas da tabela de preparação, filtre as instruções DELETE e INSERT usando uma cláusula WHERE para ignorar linhas que não estejam sendo alteradas. No entanto, se a maioria das linhas da tabela de preparação não participará da mesclagem, recomendamos executar um UPDATE e um INSERT em etapas separadas, conforme descrito posteriormente nesta seção.

## Método de mesclagem 2: especificação de uma lista de colunas sem usar MERGE
<a name="merge-method-specify-column-list"></a>

Use este método para atualizar colunas específicas na tabela de destino em vez de substituir linhas inteiras. Este método leva mais tempo que o método anterior, pois ele requer uma etapa de atualização adicional e não usa o comando MERGE. Use este método se qualquer um dos itens a seguir for verdadeiro: 
+ Não todas as colunas da tabela de destino devem ser atualizadas. 
+ A maioria das linhas na tabela de preparação não serão usadas nas atualizações. 

**Topics**
+ [Método de mesclagem 1: substituição de linhas existentes](#merge-method-replace-existing-rows)
+ [Método de mesclagem 2: especificação de uma lista de colunas sem usar MERGE](#merge-method-specify-column-list)
+ [Criação de uma tabela de preparação temporária](merge-create-staging-table.md)
+ [Execução de uma operação de mesclagem com a substituição de linhas existentes](merge-replacing-existing-rows.md)
+ [Realizar uma operação de mesclagem especificando uma lista de colunas sem usar o comando MERGE](merge-specify-a-column-list.md)
+ [Exemplos de mesclagem](merge-examples.md)

# Criação de uma tabela de preparação temporária
<a name="merge-create-staging-table"></a>

A *tabela de preparação* é uma tabela temporária que guarda todos os dados que serão usados para fazer alterações na *tabela de destino*, incluindo atualizações e inserções. 

Uma operação de mesclagem requer uma junção entre a tabela de preparação e a tabela de destino. Para posicionar as linhas da mesclagem, defina a chave de distribuição da tabela de preparação na mesma coluna que a chave de distribuição da tabela de destino. Por exemplo, se a tabela de destino usa uma coluna de chave estrangeira como chave de distribuição, use a mesma coluna para a chave de distribuição da lista de preparação. Se você cria uma tabela de preparação usando um comando [CREATE TABLE LIKE](r_CREATE_TABLE_NEW.md#create-table-like), a tabela de preparação herda a chave de distribuição da tabela pai. Se você utiliza uma instrução CREATE TABLE AS, a nova tabela não herda a chave de distribuição. Para obter mais informações, consulte . [Distribuição de dados para otimização de consultas](t_Distributing_data.md)

Se a chave de distribuição não é a mesma que a chave primária e a chave de distribuição não é atualizada como parte da operação de mesclagem, adicione um predicado de junção redundante nas colunas de chave de distribuição para permitir uma junção colocada. Por exemplo: 

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

Para verificar se consulta usará uma junção colocada, execute a consulta com [EXPLAIN](r_EXPLAIN.md) e verifique DS\$1DIST\$1NONE em todas as junções. Para obter mais informações, consulte . [Avaliação do plano de consulta](c_data_redistribution.md)

# Execução de uma operação de mesclagem com a substituição de linhas existentes
<a name="merge-replacing-existing-rows"></a>

Ao executar a operação de mesclagem detalhada no procedimento, coloque todas as etapas, exceto de criação e exclusão da tabela de preparação temporária, em uma única transação. A transação será revertida se ocorrer uma falha na etapa. O uso de uma única transação também reduz o número de confirmações, que economiza tempo e recursos.

**Para executar uma operação de mesclagem com a substituição de linhas existentes**

1. Crie uma tabela de preparação e preencha-a com os dados a serem mesclados, conforme exibido no seguinte pseudocódigo.

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

1.  Use MERGE para realizar uma junção interna com a tabela de preparação e atualizar as linhas da tabela de destino que correspondem à tabela de preparação e, depois, insira todas as linhas restantes na tabela de destino que não correspondam à tabela de preparação.

    Recomendamos que você execute as operações de atualização e inserção em um único comando 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. Descarte a tabela de preparação. 

   ```
   DROP TABLE stage;
   ```

# Realizar uma operação de mesclagem especificando uma lista de colunas sem usar o comando MERGE
<a name="merge-specify-a-column-list"></a>

Ao executar a operação de mesclagem detalhada no procedimento, coloque todas as etapas em uma única transação. A transação será revertida se ocorrer uma falha na etapa. O uso de uma única transação também reduz o número de confirmações, que economiza tempo e recursos.

**Para executar uma operação de mesclagem através da especificação de uma lista de colunas**

1. Coloque toda a operação em um único bloco de transações. 

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

1. Crie uma tabela de preparação e preencha-a com os dados a serem mesclados, conforme exibido no seguinte pseudocódigo. 

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

1. Atualize a tabela de destino usando um junção interna com a tabela de preparação. 
   + Na cláusula UPDATE, liste explicitamente as colunas a serem atualizadas. 
   + Execute uma junção interna com a tabela de preparação. 
   + Se a chave de distribuição for diferente da chave primária e a chave de distribuição não estiver sendo atualizada, adicione uma junção redundante à chave de distribuição. Para verificar se consulta usará uma junção colocada, execute a consulta com [EXPLAIN](r_EXPLAIN.md) e verifique DS\$1DIST\$1NONE em todas as junções. Para obter mais informações, consulte . [Avaliação do plano de consulta](c_data_redistribution.md)
   + Se sua tabela de destino for classificada por timestamp, adicione um predicado para tirar proveito das varreduras de intervalo restrito na tabela de destino. Para obter mais informações, consulte [Práticas recomendadas do Amazon Redshift para criar consultas](c_designing-queries-best-practices.md).
   + Se você não pretende usar todas as linhas na mesclagem, adicione uma cláusula para filtrar as linhas que precisam ser alteradas. Por exemplo, adicione um filtro de desigualdade em uma ou mais colunas para excluir as linhas que não alteraram.
   + Coloque as operações de atualização, exclusão e inserção em um único bloco de transações de forma que, se houver um problema, tudo seja revertido.

    Por exemplo: 

   ```
   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. Exclua linhas indesejadas da tabela de preparação usando um junção interna com a tabela de destino. Algumas linhas na tabela de destino já correspondem a linhas na tabela de preparação e outras foram atualizadas na etapa anterior. Em ambos os casos, elas não são necessárias para a inserção. 

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

1. Insira as linhas remanescentes da tabela de preparação. Use a mesma lista de coluna na cláusula VALUES que você usou na instrução UPDATE da etapa dois. 

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

1. Descarte a tabela de preparação. 

   ```
   drop table stage;
   ```

# Exemplos de mesclagem
<a name="merge-examples"></a>

Os seguintes exemplos executam uma mesclarem para atualizar as tabela SALES. O primeiro exemplo usa o método mais simples de excluir a tabela de destino e depois inserir todas as linhas da tabela de preparação. O segundo exemplo exige a atualização de colunas selecionadas da tabela de destino, portanto ele inclui uma etapa de atualização adicional. 

O [Exemplos de mesclagem](#merge-examples) usa um exemplo de conjunto de dados para o Amazon Redshift, chamado conjunto de dados TICKIT. Como pré-requisito, você pode configurar as tabelas e os dados do TICKIT seguindo as instruções disponíveis no guia [Conceitos básicos das tarefas comuns do banco de dados](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html). Informações mais detalhadas sobre o exemplo de conjunto de dados estão disponíveis em [Exemplo de banco de dados](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html). 

**Amostra de fonte de dados de mesclagem**

Os exemplos nesta seção precisam de uma amostra de fonte de dados que inclua atualizações e inserções. Para os exemplos, criaremos uma tabela de amostra chamada SALES\$1UPDATE usando dados da tabela SALES. Preencheremos a nova tabela com dados aleatórios que representam novas atividades de vendas para dezembro. Usaremos a tabela de amostra SALES\$1UPDATE para criar a tabela de preparação nos exemplos a seguir. 

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

**Exemplo de uma mesclagem que substitui linhas com base em chaves correspondentes**

O seguinte script usa a tabela SALES\$1UPDATE para executar uma operação de mesclagem na tabela SALES com novos dados para a atividade de vendas de dezembro. Este exemplo substitui as linhas na tabela SALES que têm atualizações. Para este exemplo, atualizaremos as colunas qtysold e pricepaid, deixando comission e saletime inalteradas.

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

**Exemplo de uma mesclagem que especifica uma lista de colunas sem usar MERGE**

O seguinte exemplo executa uma operação de mesclarem para atualizar SALES com novos dados para a atividade de vendas de dezembro. Precisamos de dados de amostra que incluam atualizações e inserções, assim como linhas que não alteraram. Para este exemplo, queremos atualizar as colunas QTYSOLD e PRICEPAID, deixando COMMISSION e SALETIME inalteradas. O seguinte script usa a tabela SALES\$1UPDATE para executar uma operação de mesclagem na tabela SALES. 

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