Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
ALTER TABLE APPEND
Aggiunge le righe a una tabella di destinazione spostando i dati da una tabella di origine esistente. I dati nella tabella di origine vengono spostati nelle colonne corrispondenti della tabella di destinazione. L'ordine delle colonne non ha importanza. Dopo che i dati sono stati aggiunti alla tabella di destinazione, la tabella di origine è vuota. ALTER TABLE APPEND è in genere molto più veloce di un'operazione CREATE TABLE AS o INSERT INTO simile in quanto i dati vengono spostati, non duplicati.
Nota
ALTER TABLE APPEND sposta i blocchi di dati tra la tabella di origine e la tabella di destinazione. Per migliorare le prestazioni, ALTER TABLE APPEND non compatta lo storage come parte dell'operazione di aggiunta. Di conseguenza, l'utilizzo della memoria aumenta temporaneamente. Per recuperare lo spazio, esegui un'operazione VACUUM.
Le colonne con lo stesso nome devono avere anche attributi di colonna identici. Se la tabella di origine o la tabella di destinazione contiene colonne che non esistono nell'altra tabella, utilizza i parametri IGNOREEXTRA o FILLTARGET per specificare la modalità di gestione delle colonne aggiuntive.
Non puoi aggiungere una colonna di identità. Se entrambe le tabelle includono una colonna di identità, il comando non riesce. Se solo una tabella ha una colonna di identità, includi il parametro FILLTARGET o IGNOREEXTRA. Per ulteriori informazioni, consulta Note per l'utilizzo di ALTER TABLE APPEND.
Puoi aggiungere una colonna GENERATED BY DEFAULT AS IDENTITY. Puoi aggiornare colonne definite come GENERATED BY DEFAULT AS IDENTITY con i valori forniti. Per ulteriori informazioni, consulta Note per l'utilizzo di ALTER TABLE APPEND.
La tabella di destinazione deve essere una tabella permanente. Tuttavia, l'origine può essere una tabella permanente o una vista materializzata configurata per l'importazione di dati in streaming. Entrambe le tabelle devono utilizzare lo stesso stile di distribuzione e la stessa chiave di distribuzione, se ne è stata definita una. Se gli oggetti sono ordinati, entrambi gli oggetti devono utilizzare lo stesso stile di ordinamento e definire le stesse colonne come chiavi di ordinamento.
Un comando ALTER TABLE APPEND automaticamente esegue il commit al completamento dell'operazione. Non è possibile eseguire il rollback. Non è possibile eseguire ALTER TABLE APPEND all'interno di un blocco di transazioni (BEGIN ... END). Per ulteriori informazioni sulle transazioni, consultare Isolamento serializzabile.
Privilegi richiesti
A seconda del comando ALTER TABLE APPEND, è richiesto uno dei seguenti privilegi:
-
Superuser
-
Utenti con il privilegio di sistema ALTER TABLE
-
Utenti con privilegi DELETE e SELECT sulla tabella di origine e privilegi INSERT sulla tabella di destinazione
Sintassi
ALTER TABLE target_table_name APPEND FROM [ source_table_name | source_materialized_view_name ] [ IGNOREEXTRA | FILLTARGET ]
L'aggiunta da una vista materializzata funziona solo nel caso in cui la vista materializzata sia configurata per Inserimento in streaming su una vista materializzata.
Parametri
- target_table_name
-
Il nome della tabella a cui vengono aggiunte le righe. Specifica solo il nome della tabella o utilizzare il formato schema_name.table_name per utilizzare uno schema specifico. La tabella di destinazione deve essere una tabella permanente esistente.
- FROM source_table_name
-
Il nome della tabella che fornisce le righe da aggiungere. Specifica solo il nome della tabella o utilizzare il formato schema_name.table_name per utilizzare uno schema specifico. La tabella di origine deve essere una tabella permanente esistente.
- FROM source_materialized_view_name
-
Il nome di una vista materializzata che fornisce le righe da aggiungere. L'aggiunta da una vista materializzata funziona solo nel caso in cui la vista materializzata sia configurata per Inserimento in streaming su una vista materializzata. La vista materializzata di origine deve esistere già.
- IGNOREEXTRA
-
Parola chiave che specifica che se la tabella di origine include colonne che non sono presenti nella tabella di destinazione, i dati nelle colonne aggiuntive devono essere eliminati. Non puoi usare IGNOREEXTRA con FILLTARGET.
- FILLTARGET
-
Parola chiave che specifica che se la tabella di origine include colonne che non sono presenti nella tabella di origine, le colonne devono contenere il valore di colonna DEFAULT se definito, altrimenti NULL. Non puoi usare IGNOREEXTRA con FILLTARGET.
Note per l'utilizzo di ALTER TABLE APPEND
ALTER TABLE APPEND sposta solo colonne identiche dalla tabella di origine alla tabella di destinazione. L'ordine delle colonne non ha importanza.
Se la tabella di origine o le tabelle di destinazione contengono colonne aggiuntive, utilizza FILLTARGET o IGNOREEXTRA in base alle seguenti regole:
-
Se la tabella di origine contiene colonne che non esistono nella tabella di destinazione, includi IGNOREEXTRA. Il comando ignora le colonne aggiuntive nella tabella di origine.
-
Se la tabella di destinazione contiene colonne che non esistono nella tabella di origine, includi FILLTARGET. Il comando inserisce nelle colonne aggiuntive della tabella di destinazione il valore di colonna predefinito o il valore IDENTITY se definito, altrimenti NULL.
-
Se sia la tabella di origine che la tabella di destinazione contengono colonne aggiuntive, il comando non riesce. Non puoi usare entrambi FILLTARGET e IGNOREEXTRA.
Se una colonna con lo stesso nome ma attributi diversi esiste in entrambe le tabelle, il comando non riesce. Le colonne con nome simile devono avere i seguenti attributi in comune:
-
Tipo di dati
-
Dimensione colonna
-
Codifica di compressione
-
Non null
-
Stile di ordinamento
-
Colonne con chiave di ordinamento
-
Stile di distribuzione
-
Colonne con chiave di distribuzione
Non puoi aggiungere una colonna di identità. Se sia la tabella di origine che la tabella di destinazione hanno colonne di identità, il comando non riesce. Se solo la tabella di origine ha una colonna di identità, includi il parametro IGNOREEXTRA in modo che la colonna di identità venga ignorata. Se solo la tabella di destinazione ha una colonna Identity, includi il parametro FILLTARGET in modo che la colonna di identità venga compilata in base alla clausola IDENTITY definita per la tabella. Per ulteriori informazioni, consulta DEFAULT.
Puoi aggiungere una colonna di identità predefinita con l'istruzione ALTER TABLE APPEND. Per ulteriori informazioni, consulta CREATE TABLE.
Esempi di ALTER TABLE APPEND
Supponiamo che la tua organizzazione mantenga una tabella, SALES_MONTHLY, per acquisire le transazioni di vendita correnti. Vuoi spostare i dati dalla tabella delle transazioni alla tabella SALES, ogni mese.
Puoi utilizzare i seguenti comandi INSERT INTO e TRUNCATE per eseguire l'operazione.
insert into sales (select * from sales_monthly); truncate sales_monthly;
Tuttavia, puoi eseguire la stessa operazione in modo molto più efficiente utilizzando il comando ALTER TABLE APPEND.
Innanzitutto, eseguire una query sulla tabella del catalogo di sistema PG_TABLE_DEF per verificare che entrambe le tabelle abbiano le stesse colonne con attributi di colonna identici.
select trim(tablename) as table, "column", trim(type) as type, encoding, distkey, sortkey, "notnull" from pg_table_def where tablename like 'sales%'; table | column | type | encoding | distkey | sortkey | notnull -----------+------------+-----------------------------+----------+---------+---------+-------- sales | salesid | integer | lzo | false | 0 | true sales | listid | integer | none | true | 1 | true sales | sellerid | integer | none | false | 2 | true sales | buyerid | integer | lzo | false | 0 | true sales | eventid | integer | mostly16 | false | 0 | true sales | dateid | smallint | lzo | false | 0 | true sales | qtysold | smallint | mostly8 | false | 0 | true sales | pricepaid | numeric(8,2) | delta32k | false | 0 | false sales | commission | numeric(8,2) | delta32k | false | 0 | false sales | saletime | timestamp without time zone | lzo | false | 0 | false salesmonth | salesid | integer | lzo | false | 0 | true salesmonth | listid | integer | none | true | 1 | true salesmonth | sellerid | integer | none | false | 2 | true salesmonth | buyerid | integer | lzo | false | 0 | true salesmonth | eventid | integer | mostly16 | false | 0 | true salesmonth | dateid | smallint | lzo | false | 0 | true salesmonth | qtysold | smallint | mostly8 | false | 0 | true salesmonth | pricepaid | numeric(8,2) | delta32k | false | 0 | false salesmonth | commission | numeric(8,2) | delta32k | false | 0 | false salesmonth | saletime | timestamp without time zone | lzo | false | 0 | false
Quindi, guarda le dimensioni di ogni tabella.
select count(*) from sales_monthly; count ------- 2000 (1 row) select count(*) from sales; count ------- 412,214 (1 row)
Ora esegui il seguente comando ALTER TABLE APPEND.
alter table sales append from sales_monthly;
Guarda di nuovo le dimensioni di ogni tabella. La tabella SALES_MONTHLY ora ha 0 righe e la tabella SALES è cresciuta di 2000 righe.
select count(*) from sales_monthly; count ------- 0 (1 row) select count(*) from sales; count ------- 414214 (1 row)
Se la tabella di origine ha più colonne della tabella di destinazione, specifica il parametro IGNOREEXTRA. L'esempio seguente utilizza il parametro IGNOREEXTRA per ignorare le colonne aggiuntive nella tabella SALES_LISTING quando si accede alla tabella SALES.
alter table sales append from sales_listing ignoreextra;
Se la tabella di destinazione ha più colonne della tabella di origine, specifica il parametro FILLTARGET. L'esempio seguente utilizza il parametro FILLTARGET per popolare le colonne nella tabella SALES_REPORT che non esistono nella tabella SALES_MONTH.
alter table sales_report append from sales_month filltarget;
L'esempio seguente mostra un esempio di come utilizzare ALTER TABLE APPEND con una vista materializzata come origine.
ALTER TABLE target_tbl APPEND FROM my_streaming_materialized_view;
I nomi delle tabelle e delle viste materializzate in questo esempio sono esempi. L'aggiunta da una vista materializzata funziona solo nel caso in cui la vista materializzata sia configurata per Inserimento in streaming su una vista materializzata. Sposta tutti i record della vista materializzata di origine in una tabella di destinazione con lo stesso schema della vista materializzata e lascia intatta la vista materializzata. Si tratta dello stesso comportamento di quando l'origine dei dati è una tabella.