In SQL, il ALTER TABLE
istruzione modifica la definizione di una tabella esistente.
Puoi usare ALTER TABLE
per modificare, aggiungere o eliminare colonne e vincoli.
A seconda del tuo DBMS, il ALTER TABLE
L'istruzione può essere utilizzata anche per riassegnare e ricostruire partizioni o disabilitare e abilitare vincoli e trigger.
Sintassi
Il ALTER TABLE
l'affermazione generalmente va così:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Dove:
table_name
è il nome della tabella che vuoi modificare.[alter_option [, alter_option] …]
è un elenco delle modifiche specifiche che desideri apportare (ad esempioADD
seguito dal nome e dalla definizione della colonna oppureDROP COLUMN
seguito dal nome della colonna, ecc.).[partition_options]
è un elenco opzionale di opzioni specifiche per le tabelle partizionate. Non tutti i DBMS supportano le tabelle partizionate. In tal caso, tali opzioni potrebbero consentirti di aggiungere, eliminare, eliminare, importare, unire o dividere partizioni o di eseguire la manutenzione del partizionamento.
La sintassi completa per ALTER TABLE
può essere piuttosto complesso e varia in modo significativo tra i DBMS. Per tutto quanto non trattato in questo articolo, consulta la documentazione del DBMS.
Di seguito sono riportati esempi del più comune ALTER TABLE
operazioni.
Aggiungi una nuova colonna
Per aggiungere una nuova colonna a una tabella, usa ADD
clausola, seguita dal nome della colonna e dal tipo di dati.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Questo aggiunge una nuova colonna chiamata ProductDescription
ai Products
tabella.
In questo esempio, abbiamo reso la colonna un varchar(500)
ma useresti qualsiasi tipo di dati sia appropriato per la tua nuova colonna.
Puoi anche includere vincoli nella definizione della tua colonna, ma ciò può dipendere dal tuo DBMS e dal fatto che la tabella contenga già o meno dati (vedi la discussione di seguito su questo).
Rinomina una colonna
La maggior parte dei principali RDBMS (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) consentono di rinominare una colonna come questa:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Se utilizzi MySQL precedente alla versione 8.0 o MariaDB precedente alla 10.5.2+, dovrai utilizzare CHANGE COLUMN
sintassi invece, che richiede anche di ridefinire il tipo di dati. In questo modo:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
In SQL Server, dovrai utilizzare sp_rename
stored procedure per rinominare una colonna. In questo modo:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Rilascia una colonna
Per eliminare una colonna, usa DROP COLUMN
clausola, seguita dal nome della colonna.
ALTER TABLE table_name
DROP COLUMN column_name;
Modifica la definizione di una colonna
La sintassi per modificare la definizione di una colonna esistente varia in modo significativo tra i DBMS. Dipende anche dalle modifiche che devi apportare.
Per semplificare le cose, eseguiamo una semplice modifica a una colonna in SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
In questo esempio, abbiamo modificato il ProductDescription
colonna da varchar(500)
a varchar(1000)
.
Di seguito viene mostrata la sintassi di base richiesta da ciascun DBMS per apportare modifiche uguali o simili.
SQL Server:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB e Oracle prima di 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
In Oracle 10g e versioni successive:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite non ti consente di modificare una colonna, se non di rinominarla.
La sintassi effettiva per ciascun DBMS è solitamente molto più complessa di questa e dipende esattamente da ciò che stai cercando di fare. Tuttavia, questo dovrebbe iniziare con le modifiche di base delle colonne.
Restrizioni e considerazioni
In genere dovresti evitare di apportare modifiche alle tabelle una volta che contengono dati. Apportando modifiche, corri il rischio di perdere i dati esistenti.
Detto questo, molti DBMS in realtà ti impediscono di apportare determinate modifiche una volta che una tabella contiene dati. Ad esempio, potresti scoprire che non puoi aggiungere un NOT NULL
vincolo a una colonna che contiene dati.
Alcuni DBMS potrebbero consentirti di farlo, purché utilizzi un DEFAULT
vincolo (per fornire un valore predefinito per le colonne in cui non sono stati inseriti dati in modo esplicito), o una colonna Identità/incremento automatico, o una colonna timestamp, ecc.
Alcuni DBMS non consentono di eliminare o modificare le colonne in una tabella.
Inoltre, alcuni DBMS limitano i tipi di dati che possono essere aggiunti.
Esempio:aggiunta di un vincolo NOT NULL
Ecco un esempio per aiutare a dimostrare i punti precedenti.
Ecco cosa succede quando provo ad aggiungere una colonna con un NOT NULL
vincolo in SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Risultato:
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
Fondamentalmente, la tabella contiene già dati, quindi SQL Server restituisce un errore che mi dice che posso solo aggiungere un NOT NULL
vincolo se la tabella soddisfa determinati criteri e non soddisfa ancora tali criteri.
E c'è una buona ragione per questo criterio.
Un NOT NULL
il vincolo assicura che non ci siano NULL
valori nella colonna in qualsiasi riga. Il problema è che abbiamo già dei dati nella tabella e se aggiungiamo una nuova colonna, quelle righe esistenti saranno NULL
– che violerà immediatamente il nostro NOT NULL
vincolo. Quindi dobbiamo specificare i dati da inserire nelle righe esistenti.
Per fare ciò, possiamo aggiungere un DEFAULT
vincolo o simili per garantire che tutte le righe esistenti vengano popolate automaticamente con i dati in questa colonna.
Esempio:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Questo aggiunge semplicemente un DEFAULT
vincolo alla colonna. Questo vincolo garantisce che tutte le righe contengano un valore (in questo caso, il valore è N/A
) se non è stato assegnato un valore. Ciò significa che il nostro NOT NULL
il vincolo non verrà violato, perché tutte le righe esistenti conterranno ora un valore.
Se la nuova colonna deve avere valori univoci e incrementali, puoi invece renderla un IDENTITY
colonna (o AUTOINCREMENT
in SQLite e altri DBMS).
Tuttavia, se la tabella non contiene già dati, potresti essere in grado di aggiungere la colonna senza dover eseguire nessuno di questi passaggi.
Opzioni di partizione
Questo articolo è rivolto ai principianti e le tabelle partizionate sono un po' al di fuori del regno del tutorial per principianti.
Detto questo, esaminerò rapidamente alcune delle opzioni di partizionamento per quanto riguarda ALTER TABLE
dichiarazione.
Se il tuo DBMS supporta tabelle partizionate, probabilmente fornisce anche opzioni di partizione con ALTER TABLE
dichiarazione.
Ad esempio, in MySQL potresti fare quanto segue:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Questo partiziona la tabella in 8 partizioni, per HASH
, utilizzando ProductId
colonna come chiave di partizionamento.
PARTITION BY HASH
utilizza il resto dell'espressione (in questo caso ProductId
colonna) diviso per il numero di partizioni (cioè il modulo).
Puoi anche usare le partizioni di intervallo. Ecco come potresti aggiungere una partizione di intervallo a una tabella esistente:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Questo esempio implica che i Products
la tabella ha già 8 partizioni di intervallo e stiamo aggiungendo un'altra partizione chiamata Partition9
.
Puoi eliminare partizioni come questa:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Tieni presente che questi esempi sono per MySQL.
Ho anche scritto alcuni articoli sulle tabelle partizionate in SQL Server. Per quanto riguarda il ALTER TABLE
istruzione, ecco come cambiare una partizione ed ecco come passare a una partizione (entrambi i quali sono fatti con ALTER TABLE
).
In SQL Server, alcune opzioni di partizione devono essere eseguite con altre istruzioni. Ad esempio, l'unione di partizioni viene eseguita con ALTER PARTITION FUNCTION
istruzione e la divisione delle partizioni viene eseguita con ALTER PARTITION SCHEME
dichiarazione.
Se desideri saperne di più sulle tabelle partizionate in SQL Server, ecco come creare una tabella partizionata in SQL Server.
ALTER TABLE
in SQLite
Dovrei anche menzionare che SQLite ha un supporto molto limitato per ALTER TABLE
dichiarazione. In SQLite, il ALTER TABLE
consente di rinominare una tabella, rinominare una colonna all'interno di una tabella o aggiungere una nuova colonna a una tabella esistente.
Qualsiasi altra modifica richiederà di abbandonare il tavolo e ricominciare. Questo vale anche per l'aggiunta di chiavi esterne.