Come rimuovere una colonna da una tabella esistente?


Risposte:



157

Generico:

ALTER TABLE table_name DROP COLUMN column_name;

Nel tuo caso:

ALTER TABLE MEN DROP COLUMN Lname;

72

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


47

Questa è la risposta corretta:

ALTER TABLE MEN DROP COLUMN Lname

Ma ... se un CONSTRAINTesiste sul COLUMN, quindi è necessario DROPil CONSTRAINTprimo, allora si sarà in grado di DROPla COLUMN. Per rilasciare a CONSTRAINT, esegui:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE tb_name DROP FOREIGN KEY key_name
bortunac

3
COME FARE una ricerca constraintper una colonna ?
Kiquenet,

21

In SQL Server 2016 è possibile utilizzare nuove istruzioni DIE.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

La query sopra è eseguibile nuovamente dropsnella colonna solo se existsnella tabella altrimenti non genererà errori.

Invece di utilizzare IFwrapper di grandi dimensioni per verificare l'esistenza di columnprima di rilasciarlo, puoi semplicemente eseguire l' DDListruzione sopra


3
Cosa sono le dichiarazioni DIE ?
Kiquenet,

3
A proposito, puoi chiamare questi tipi di script / funzioni "ri-eseguibili" Idempotente
tomosius

4
questa dovrebbe essere la risposta accettata. Se si dispone di distribuzioni automatiche di script SQL, è necessario scrivere gli script in modo difensivo in questo modo.
vincitore

7

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  

1
Suppongo che se volessi eliminare una colonna da una tabella inesistente, questo sarebbe il modo di farlo
Matiaan,

6

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:

  • Utilizzato da un indice
  • Utilizzato dai vincoli CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY
  • Associato a un DEFAULT
  • Legato a una regola

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.


2

Per aggiungere colonne nella tabella esistente:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

Per eliminare le colonne nella tabella esistente:

ALTER TABLE table_name
DROP COLUMN column_name

Domanda non sulle colonne ADD .
Kiquenet,

2

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.

  1. Metti la tabella in visualizzazione Progettazione (fai clic destro sulla tabella) in questo modo:

inserisci qui la descrizione dell'immagine

  1. Fare clic destro sulla colonna nella vista Progettazione della tabella e fare clic su "Elimina colonna"

inserisci qui la descrizione dell'immagine

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.


0

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 ()


Cosa farà questa risposta? Rimuoverà la colonna dalla tabella?
Prashant Pimpale,

0

Sintassi:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Per esempio:

alter table Employee drop column address;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.