Database
 sql >> Database >  >> RDS >> Database

SQL ALTER TABLE per principianti

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 esempio ADD seguito dal nome e dalla definizione della colonna oppure DROP 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.