Come rimuovere una colonna da una tabella esistente?
Ho un tavolo MEN
con Fname
eLname
Devo rimuovere il file Lname
Come farlo?
Come rimuovere una colonna da una tabella esistente?
Ho un tavolo MEN
con Fname
eLname
Devo rimuovere il file Lname
Come farlo?
Risposte:
ALTER TABLE MEN DROP COLUMN Lname
Il tuo esempio è semplice e non richiede ulteriori modifiche alla tabella, ma in generale questo non è così banale.
Se questa colonna è referenziata da altre tabelle, allora devi capire cosa fare con altre tabelle / colonne. Un'opzione è rimuovere le chiavi esterne e conservare i dati di riferimento in altre tabelle.
Un'altra opzione è quella di trovare tutte le colonne di riferimento e rimuoverle anche se non sono più necessarie.
In questi casi la vera sfida è trovare tutte le chiavi esterne. Puoi farlo interrogando le tabelle di sistema o usando strumenti di terze parti come ApexSQL Search (gratuito) o Red Gate Dependency tracker (funzionalità premium ma più). C'è un intero thread su chiavi esterne qui
Questa è la risposta corretta:
ALTER TABLE MEN DROP COLUMN Lname
Ma ... se un CONSTRAINT
esiste sul COLUMN
, quindi è necessario DROP
il CONSTRAINT
primo, allora si sarà in grado di DROP
la COLUMN
. Per rilasciare a CONSTRAINT
, esegui:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
per una colonna ?
In SQL Server 2016 è possibile utilizzare nuove istruzioni DIE.
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
La query sopra è eseguibile nuovamente drops
nella colonna solo se exists
nella tabella altrimenti non genererà errori.
Invece di utilizzare IF
wrapper di grandi dimensioni per verificare l'esistenza di column
prima di rilasciarlo, puoi semplicemente eseguire l' DDL
istruzione sopra
La domanda è: puoi eliminare solo una colonna da una tabella inesistente ;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print 'FAILED!'
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print 'NO TABLE OR COLUMN FOUND !'
END
COMMIT
La semplice risposta a questa è usare questo:
ALTER TABLE MEN DROP COLUMN Lname;
È possibile specificare più di una colonna in questo modo:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
Da SQL Server 2016 è anche possibile eliminare la colonna solo se esiste. Questo ti impedisce di ricevere un errore quando la colonna non esiste, il che probabilmente non ti interessa.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Ci sono alcuni prerequisiti per eliminare le colonne. Le colonne rilasciate non possono essere:
Se uno dei precedenti è vero, è necessario eliminare prima tali associazioni.
Inoltre, va notato che l'eliminazione di una colonna non recupera lo spazio dal disco rigido fino alla ricostruzione dell'indice cluster della tabella. Come tale, è spesso una buona idea seguire quanto sopra con un comando di ricostruzione tabella come questo:
ALTER TABLE MEN REBUILD;
Infine, come alcuni hanno detto, questo può essere lento e probabilmente bloccherà la tabella per tutta la durata. È possibile creare una nuova tabella con la struttura desiderata e quindi rinominare in questo modo:
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';
DROP TABLE old_MEN;
Ma attenzione c'è una finestra per la perdita di dati delle righe inserite tra la prima selezione e l'ultimo comando di rinomina.
Questo può essere fatto anche tramite la GUI di SSMS. La cosa bella di questo metodo è che ti avverte se ci sono relazioni su quella colonna e può anche eliminare automaticamente anche quelle.
Come ho detto prima, se ci sono delle relazioni che dovrebbero anche essere eliminate, a questo punto ti verrà chiesto se desideri eliminare anche quelle. Probabilmente dovrai farlo per eliminare la colonna.
Se stai usando C # e la colonna Identità è int, crea una nuova istanza di int senza fornire alcun valore. Ha funzionato per me.
[identity_column] = new int ()
Sintassi:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Per esempio:
alter table Employee drop column address;