Wie werden mehrere Spalten mit einer einzigen ALTER TABLE-Anweisung in SQL Server gelöscht?

292

Ich möchte einen einzelnen SQL-Befehl schreiben, um mehrere Spalten aus einer einzelnen Tabelle in einer zu löschen ALTER TABLE Anweisung löschen.

Aus der ALTER TABLE-Dokumentation von MSDN ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Gibt an, dass der Einschränkungsname oder der Spaltenname aus der Tabelle entfernt wird. DROP COLUMN ist nicht zulässig, wenn die Kompatibilitätsstufe 65 oder früher ist. Es können mehrere Spalten und Einschränkungen aufgelistet werden.

Es heißt, dass mehrere Spalten in der Anweisung aufgeführt werden können, die Syntax jedoch kein optionales Komma oder irgendetwas anzeigt, das sogar auf die Syntax hinweisen würde.

Wie soll ich meine SQL schreiben, um mehrere Spalten in einer Anweisung zu löschen (wenn möglich)?

Jesse Webb
quelle

Antworten:

431

Für SQL Server:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

Die Syntax lautet

DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ] 

Für MySQL:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

oder so 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1 Das Wort COLUMNist optional und kann weggelassen werden, außer RENAME COLUMN(um eine Spaltenumbenennungsoperation von der RENAMETabellenumbenennungsoperation zu unterscheiden ). Mehr Infos hier .

Alex Aza
quelle
1
@Gweebz - Ich gehe davon aus, dass der Fehler, den Sie hatten, mit der Spaltennutzung zusammenhängt. Die Spalte kann in einer Einschränkung, einem Index oder einer anderen berechneten Spalte verwendet werden.
Alex Aza
Genau; Die zweite Spalte, die ich hatte, wurde in einem Index verwendet. Ich habe diesen Index gelöscht und meine DROP-Anweisung hat danach perfekt funktioniert.
Jesse Webb
@jeicam - Das wäre wahrscheinlich passiert, weil 1 der Spalten, die Sie löschen möchten, möglicherweise ein Primärschlüssel ist.
Benny
196

Zusammenfassen

Oracle :

ALTER TABLE table_name DROP (column_name1, column_name2);

MS SQL Server :

ALTER TABLE table_name DROP COLUMN column_name1, column_name2

MySQL :

ALTER TABLE table_name DROP column_name1, DROP column_name2;

PostgreSQL

ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2;

Sei vorsichtig

DROP COLUMNentfernt die Daten für einige DBMS nicht physisch . ZB für MS SQL. Bei Typen mit fester Länge ( int , numerisch , float , datetime , uniqueidentifier usw.) wird der Speicherplatz auch für Datensätze belegt, die nach dem Löschen der Spalten hinzugefügt wurden. Um den verschwendeten Platz loszuwerden, tun Sie ALTER TABLE ... REBUILD.

Denis Rozhnev
quelle
3
Für PostgreSQL können Sie sogar COLUMNSchlüsselwörter wie in MySql weglassen .
Artem Novikov
1
Sie können für MySQL auch dasselbe Format wie für MS SQL und Postgre SQL verwenden: ALTER TABLE Tabellenname DROP COLUMN Spaltenname1, Spaltenname2;
Jciloa
Vielen Dank, dass Sie die Antworten auf andere DB-Anbieter erweitert haben!
KJP
39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

Beachten Sie, dass DROP COLUMN die Daten nicht physisch entfernt und bei Typen mit fester Länge (int, numerisch, float, datetime, uniqueidentifier usw.) der Speicherplatz auch für Datensätze belegt wird, die nach dem Löschen der Spalten hinzugefügt wurden. Um den verschwendeten Platz loszuwerden, tun Sie ALTER TABLE ... REBUILD.

Remus Rusanu
quelle
11
+1 für den Hinweis zu Tischgrößen und zur Erneuerung. Können Sie einen Link zur Dokumentation als Referenz bereitstellen?
Jesse Webb
2
Genau dort in der ALTER TABLE: msdn.microsoft.com/en-us/library/ms190273.aspx
Remus Rusanu
4
Ich sprach mit meinem DBA über ein REBUILD und er sagte, wenn die Tabelle einen Clustered Index hätte (was meiner tat), könnte ich einfach laufen ALTER INDEX PK_IndexName ON TableName REBUILDund es würde den Speicherplatz zurückfordern. Dies wird hier etwas beschrieben: msdn.microsoft.com/en-us/library/ms189858.aspx unter dem Abschnitt " Wiederherstellen eines Index".
Jesse Webb
1
Jeder kann etwas Licht ins Dunkel bringen, WARUM würde dies so umgesetzt werden? Wenn ich die Spalte gelöscht habe, erwarte ich, dass Indizes, Daten und alles, was auf dieser Spalte aufgebaut ist, weg sind. Platzverschwendung ohne Vorwarnung zu lassen, scheint eine schlechte Übung zu sein, oder fehlt mir etwas?
DanteTheSmith
13

Dies kann zu spät sein, aber teilen Sie es für die neuen Benutzer, die diese Frage besuchen. Um mehrere Spalten zu löschen, ist die tatsächliche Syntax

alter table tablename drop column col1, drop column col2 , drop column col3 ....

Daher müssen Sie für jede Spalte in Mysql 5.0.45 "drop column" angeben.

MANISH ZOPE
quelle
Dies ist eine falsche Syntax. Verwendung: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1
@ Graeme die Syntax ist korrekt, ich habe es getestet und es funktioniert, wenn ich verwende: ALTER TABLE Test DROP COLUMN c1, c2; MySQL wirft einen Fehler aus. ... in der Nähe von c2
Tom Mwenda
6
@ TomBikiNurse Die Frage hat eine MSDN-Referenz, daher wurde angenommen, dass die betreffende SQL mit MS SQL Server und nicht mit MySQL
Surya Pratap
Dies ist die eigentliche Syntax. Die besser gewählten Antworten sind falsch.
Vardumper
@SuryaPratap In der Frage wird im letzten Absatz 'my SQL' erwähnt.
Eternal21
4

Die von Microsoft angegebene Syntax für das Löschen eines Spaltenteils einer ALTER- Anweisung lautet wie folgt

 DROP 
 {
     [ CONSTRAINT ] 
     { 
          constraint_name 
          [ WITH 
           ( <drop_clustered_constraint_option> [ ,...n ] ) 
          ] 
      } [ ,...n ]
      | COLUMN 
      {
          column_name 
      } [ ,...n ]
 } [ ,...n ]

Beachten Sie, dass [, ... n] sowohl nach dem Spaltennamen als auch am Ende der gesamten drop-Klausel angezeigt wird. Dies bedeutet, dass es zwei Möglichkeiten gibt, mehrere Spalten zu löschen. Sie können dies entweder tun:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

oder dieses

ALTER TABLE TableName
    DROP 
        COLUMN Column1,
        COLUMN Column2,
        COLUMN Column3

Diese zweite Syntax ist nützlich, wenn Sie das Löschen einer Spalte mit dem Löschen einer Einschränkung kombinieren möchten:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Beim Löschen von Spalten stellt SQL Server den von den abgelegten Spalten belegten Speicherplatz nicht wieder her. Bei Datentypen, die in den Zeilen inline gespeichert sind (z. B. int), wird möglicherweise sogar Platz in den neuen Zeilen belegt, die nach der alter-Anweisung hinzugefügt werden. Um dies zu umgehen, müssen Sie einen Clustered-Index für die Tabelle erstellen oder den Clustered-Index neu erstellen, falls er bereits einen hat. Die Neuerstellung des Index kann nach dem Ändern der Tabelle mit einem REBUILD-Befehl erfolgen. Aber seien Sie gewarnt, dies kann an sehr großen Tischen langsam sein. Beispielsweise:

ALTER TABLE Test
    REBUILD;
Martin Brown
quelle
3

Für MySQL (Version 5.6) können Sie nicht mehrere Spalten mit einer einzigen dropAnweisung löschen, sondern mehrere dropAnweisungen:

mysql> alter table test2 drop column (c1,c2,c3);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(c1,c2,c3)' at line 1
mysql> alter table test2 drop column c1,c2,c3;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c2,c3' at line 1
mysql> alter table test2 drop column c1, drop column c2, drop c3;
Query OK, 0 rows affected (0.64 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> 

Übrigens, drop <col_name>ist eine Abkürzung für, drop column <col_name>wie Sie von drop c3oben sehen können.

CSY
quelle
2

Wenn es nur eine einzelne Spalte zum Löschen ist, funktioniert die folgende Syntax

ALTER TABLE tablename DROP COLUMN column1;

Beim Löschen mehrerer Spalten DROP COLUMNfunktioniert die folgende Syntax nicht

ALTER TABLE tablename DROP (column1, column2, column3......);

kk250040
quelle
1
alter table tablename drop (column1, column2, column3......);
Neelima
quelle
Dies ist eine falsche Syntax. Verwendung: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
1

Generisch:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Z.B:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;
Chirag Thakar
quelle
0

Diese Abfrage ändert den mehrspaltigen Test.

create table test(a int,B int,C int);

alter table test drop(a,B);
Ratan Nahak
quelle
Dies ist eine falsche Syntax. Verwendung: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme
0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

für MySQL DB.

Oder Sie können eine Spalte hinzufügen, während Sie in derselben Zeile ändern:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
naveen vaishnav
quelle