Wie entferne ich eine Spalte aus einer vorhandenen Tabelle?


Antworten:



157

Generisch:

ALTER TABLE table_name DROP COLUMN column_name;

In Ihrem Fall:

ALTER TABLE MEN DROP COLUMN Lname;

72

Ihr Beispiel ist einfach und erfordert keine zusätzlichen Tabellenänderungen, aber im Allgemeinen ist dies nicht so trivial.

Wenn diese Spalte von anderen Tabellen referenziert wird, müssen Sie herausfinden, was mit anderen Tabellen / Spalten zu tun ist. Eine Möglichkeit besteht darin, Fremdschlüssel zu entfernen und referenzierte Daten in anderen Tabellen zu behalten.

Eine andere Möglichkeit besteht darin, alle referenzierenden Spalten zu finden und ebenfalls zu entfernen, wenn sie nicht mehr benötigt werden.

In solchen Fällen besteht die eigentliche Herausforderung darin, alle Fremdschlüssel zu finden. Sie können dies tun, indem Sie Systemtabellen abfragen oder Tools von Drittanbietern wie ApexSQL Search (kostenlos) oder Red Gate Dependency Tracker (Premium, aber mehr Funktionen) verwenden. Es gibt einen ganzen Thread auf Fremdschlüssel hier


47

Dies ist die richtige Antwort:

ALTER TABLE MEN DROP COLUMN Lname

Aber ... wenn ein CONSTRAINTauf das existiert COLUMN, dann müssen Sie DROPdas CONSTRAINTerste, dann sind Sie in der Lage sein , DROPdie COLUMN. CONSTRAINTFühren Sie Folgendes aus , um a zu löschen :

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE tb_name DROP FOREIGN KEY Schlüsselname
bortunac

3
Wie suche ich nach constrainteiner Spalte ?
Kiquenet

21

In SQL Server 2016 können Sie neue DIE-Anweisungen verwenden.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Die obige Abfrage kann in dropsder Spalte nur dann erneut ausgeführt werden, wenn dies der Fall istexists in der in der Tabelle andernfalls keinen Fehler auslöst.

Anstatt große IFWrapper zu verwenden, um die Existenz von zu überprüfen, columnbevor Sie sie löschen, können Sie einfach die obige DDLAnweisung ausführen


3
Was sind DIE-Aussagen ?
Kiquenet

3
Übrigens können Sie diese Arten von "wieder ausführbaren" Skripten / Funktionen als Idempotent
tomosius

4
Dies sollte die akzeptierte Antwort sein. Wenn Sie automatisierte SQL-Skripte bereitgestellt haben, müssen Sie Ihre Skripte defensiv so schreiben.
Sieger

7

Die Frage ist, können Sie nur eine Spalte aus einer nicht vorhandenen Tabelle löschen ;-)

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
Ich nehme an, wenn Sie eine Spalte aus einer nicht vorhandenen Tabelle löschen möchten, ist dies der
richtige

6

Die einfache Antwort darauf lautet:

ALTER TABLE MEN DROP COLUMN Lname;

Es kann mehr als eine Spalte wie folgt angegeben werden:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

Ab SQL Server 2016 ist es auch möglich, die Spalte nur dann zu löschen, wenn sie vorhanden ist. Dies verhindert, dass Sie eine Fehlermeldung erhalten, wenn die Spalte nicht vorhanden ist, was Sie wahrscheinlich nicht interessiert.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

Es gibt einige Voraussetzungen, um Spalten zu löschen. Die abgelegten Spalten können nicht sein:

  • Wird von einem Index verwendet
  • Wird von den Einschränkungen CHECK, FOREIGN KEY, UNIQUE oder PRIMARY KEY verwendet
  • Verbunden mit einem STANDARD
  • An eine Regel gebunden

Wenn eine der oben genannten Aussagen zutrifft, müssen Sie diese Assoziationen zuerst löschen.

Es sollte auch beachtet werden, dass das Löschen einer Spalte den Speicherplatz von der Festplatte nicht zurückfordert, bis der Clustered-Index der Tabelle neu erstellt wird. Daher ist es oft eine gute Idee, dem obigen Befehl einen Tabellenwiederherstellungsbefehl wie den folgenden zu folgen:

ALTER TABLE MEN REBUILD;

Schließlich kann dies, wie einige gesagt haben, langsam sein und wird wahrscheinlich die Tabelle für die Dauer sperren. Es ist möglich, eine neue Tabelle mit der gewünschten Struktur zu erstellen und diese dann wie folgt umzubenennen:

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;

Beachten Sie jedoch, dass hier zwischen dem ersten Auswahl- und dem letzten Umbenennungsbefehl ein Fenster für den Datenverlust eingefügter Zeilen angezeigt wird.


2

So fügen Sie Spalten in vorhandene Tabellen ein:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

So löschen Sie Spalten in einer vorhandenen Tabelle:

ALTER TABLE table_name
DROP COLUMN column_name

Frage nicht zu ADD- Spalten.
Kiquenet

2

Dies kann auch über die SSMS-GUI erfolgen. Das Schöne an dieser Methode ist, dass Sie gewarnt werden, wenn in dieser Spalte Beziehungen vorhanden sind, und diese auch automatisch gelöscht werden können.

  1. Fügen Sie die Tabelle wie folgt in die Entwurfsansicht ein (Rechtsklick auf die Tabelle):

Geben Sie hier die Bildbeschreibung ein

  1. Klicken Sie mit der rechten Maustaste auf die Spalte in der Entwurfsansicht der Tabelle und klicken Sie auf "Spalte löschen".

Geben Sie hier die Bildbeschreibung ein

Wie bereits erwähnt, werden Sie an dieser Stelle gefragt, ob Sie auch diese löschen möchten, wenn es Beziehungen gibt, die ebenfalls gelöscht werden müssten. Sie müssen dies wahrscheinlich tun, um die Spalte zu löschen.


0

Wenn Sie C # verwenden und die Spalte "Identität" int ist, erstellen Sie eine neue Instanz von int, ohne einen Wert anzugeben. Es hat bei mir funktioniert.

[identity_column] = new int ()


Was wird diese Antwort tun? Wird die Spalte aus der Tabelle entfernt?
Prashant Pimpale

0

Syntax:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Zum Beispiel:

alter table Employee drop column address;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.