ALTER TABLE
Usare il comando ALTER TABLE per modificare la struttura di una tabella esistente. Se la tabella è utilizzata da una query attiva, il comando ALTER attende il completamento della query.
- Modificare o eliminare una colonna predefinita. Le impostazioni predefinite si applicano solo ai comandi INSERT successivi, non alle righe già presenti nella tabella.
- Rinominare una colonna o una tabella senza modificare il tipo di dati o le dimensioni della colonna o della tabella. È possibile omettere la colonna delle parole chiave.
- Aggiungere o eliminare un vincolo di tabella o di colonna. Non è possibile modificare un vincolo. È necessario invece eliminare il vincolo e crearne uno nuovo.
- Modifica la lunghezza di una colonna varchar.
Se una tabella è referenziata da una stored procedure, non è consentito aggiungere o eliminare una colonna. È necessario eliminare la stored procedure prima di eseguire il comando ALTER TABLE e ricreare la stored procedure dopo la modifica della tabella.
Sintassi
ALTER TABLE <table> <action><action> può essere uno dei seguenti:ADD COLUMN <col> <type> [<col_constraint>][,…] |
ADD <table_constraint> |
ALTER [COLUMN] <col> { SET DEFAULT <value> | DROP DEFAULT } |
DROP [COLUMN] column_name[,column_name…] {CASCADE | RESTRICT } |
DROP CONSTRAINT <constraint_name> {CASCADE | RESTRICT} |
MODIFY COLUMN (<col> VARCHAR(<maxsize>)) |
ORGANIZE ON {(<columns>) | NONE} |
OWNER TO <user_name> |
RENAME [COLUMN] <col> TO <new_col_name> |
RENAME TO <new_table> |
SET PRIVILEGES TO <table> |
DATA_VERSION_RETENTION_TIME <number-of-days>
<col_constraint> rappresenta:[ CONSTRAINT <constraint_name> ]
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]<table_constraint> rappresenta:[ CONSTRAINT <constraint_name> ]
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]<ref> rappresenta:REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]Input
Il comando ALTER TABLE riceve i seguenti input:
| Immissione | Descrizione |
|---|---|
| <table> | Il nome della tabella da modificare. |
| <azione> | L'azione da eseguire per la tabella specificata:
|
| <col> | Il nome di una colonna. |
| <nome_utente> | Il nome di un utente. |
| <nome_col_nuovo> | Il nuovo nome da assegnare alla colonna. |
| <nuova_tabella> | Il nuovo nome della tabella. |
| <nome_del_ vincolo> | Il nome da assegnare a un vincolo di colonna o a un vincolo di tabella. Se non si specifica un nome, il sistema ne genera uno. |
| NON DIFFERIBILE | DIFFERIBILE | Controlla se il vincolo può essere rinviato alla fine della transazione. NON DEFERIBILE è l'impostazione predefinita. Netezza Performance Server non supporta il controllo dei vincoli e l'integrità referenziale) |
| INITIALLY | Specifica DEFERRED (alla fine della transazione) o IMMEDIATE (alla fine di ogni estratto conto). |
| NON NULLO | NULLO | Se la colonna può contenere valori nulli. NULL è l'impostazione predefinita. |
| UNIQUE (vincolo di colonna e di tabella) | Se ogni valore della colonna deve essere unico. |
| PRIMARY KEY (vincolo di colonna e di tabella) | Se le colonne specificate devono costituire la chiave primaria della tabella. Questo vincolo è essenzialmente una combinazione dei vincoli UNIQUE e NOT NULL, ma l'identificazione di un insieme di colonne come chiave primaria fornisce anche metadati sulla progettazione dello schema. Una chiave primaria implica che altre tabelle possano fare affidamento su questo insieme di colonne come identificatore univoco delle righe. È possibile specificare un solo vincolo di chiave primaria per una tabella, sia come vincolo di colonna che come vincolo di tabella. L'insieme delle colonne che compongono la chiave primaria deve essere diverso da qualsiasi altro insieme di colonne nominato da qualsiasi vincolo univoco definito per la tabella. |
| DEFAULT (vincolo di colonna) | Il valore predefinito da inserire in ogni riga per questa colonna. |
| REFERENCES (vincolo di colonna) | Le colonne specificate della nuova tabella devono contenere solo valori che corrispondono ai valori delle colonne specificate della tabella specificata. |
| FOREIGN KEY e REFERENCES tabella (vincolo di tabella) | Le colonne specificate della nuova tabella devono contenere solo valori che corrispondono ai valori delle colonne specificate della tabella specificata. Se non si specifica una colonna, il valore deve corrispondere alla chiave primaria della tabella. Le colonne specificate della tabella di riferimento devono avere un vincolo di chiave unica o primaria in quella tabella. |
| PARTITA COMPLETA | MATCH FULL impedisce che una colonna di una chiave esterna multicolonna sia nulla se le altre parti della chiave esterna non sono nulle. Questo è il valore predefinito. MATCH PARTIAL non è supportato. |
| SU AGGIORNAMENTO | SU CANCELLAZIONE | L'azione da eseguire quando la tabella o le colonne specificate vengono aggiornate o eliminate:
|
| TEMPO_DI_RITENZIONE_DEI_DATI | Modifica il tempo di ritenzione di una tabella. Se il tempo di conservazione è zero, è necessario specificare un valore non nullo di DATA_VERSION_RETENTION_TIME per eseguire le query di spostamento nel tempo. Se si desidera modificare DATA_VERSION_RETENTION_TIME con un valore diverso da zero per una tabella temporanea, protetta dalle righe, versionata o esterna, il comando fallisce. Il valore massimo consentito è 99 giorni. Se DATA_VERSION_RETENTION_TIME per una tabella è impostato su 0, la tabella non è più una tabella temporale e non sono disponibili dati storici per la tabella per le interrogazioni temporali. Non è possibile eseguire query temporali per tabelle con tempo di conservazione impostato a 0. Per ulteriori informazioni sul viaggio nel tempo e su DATA_VERSION_RETENTION_TIME, vedere Per iniziare con il viaggio nel tempo. |
Output
Il comando ALTER TABLE produce i seguenti risultati:
| Emissione | Descrizione |
|---|---|
| ALTER | Il comando è stato eseguito correttamente. |
| ERROR | La tabella o la colonna specificata non è disponibile. |
Privilegi
È necessario essere l'utente admin, il proprietario della tabella, il proprietario del database o dello schema in cui è definita la tabella, oppure l'account deve avere il privilegio Alter per la tabella o per la classe di oggetti Table. Se si cambia il proprietario della tabella, è necessario avere l'accesso List all'account utente.
Utilizzo
- Elimina il valore predefinito da una colonna:
MYDB.SCH1(USER)=> ALTER TABLE distributors ALTER COLUMN address DROP DEFAULT; - Modifica la lunghezza della varchar di una colonna:
MYDB.SCH1(USER)=> ALTER TABLE t3 MODIFY COLUMN (col1 VARCHAR(6)); - Modificare il nome di una colonna:
MYDB.SCH1(USER)=> ALTER TABLE distributors RENAME COLUMN address TO city; - Modificare il nome di una tabella:
MYDB.SCH1(USER)=> ALTER TABLE distributors RENAME TO suppliers; - Cambiare il proprietario della tabella:
MYDB.SCH1(USER)=> ALTER TABLE distributors OWNER TO carmen; - Cambiare i privilegi con quelli impostati per un'altra tabella:
MYDB.SCH1(USER)=> ALTER TABLE distributors SET PRIVILEGES TO suppliers; - Aggiungere un vincolo:
MYDB.SCH1(USER)=> ALTER TABLE distributors ADD CONSTRAINT empkey PRIMARY KEY(col1) INITIALLY IMMEDIATE; - Eliminare un vincolo:
MYDB.SCH1(USER)=> ALTER TABLE distributors DROP CONSTRAINT empkey CASCADE; - Cambiare le tabelle temporali in tabelle non temporali:
ALTER TABLE PRODUCT DATA_VERSION_RETENTION_TIME 0; - Modifica delle tabelle non temporali in tabelle temporali:
ALTER TABLE PRODUCT DATA_VERSION_RETENTION_TIME 30;Se prima si disattiva la tabella temporale e poi si converte la stessa tabella in una tabella temporale, non si ha accesso alle righe storiche precedenti di quella tabella. I dati storici vengono raccolti quando le righe vengono eliminate o aggiornate dopo la conversione della tabella in temporale.