396 Stimmen

Wie kann man mehrere Spalten mit einer einzigen ALTER TABLE-Anweisung in SQL Server löschen (DROP)?

Ich möchte einen einzigen SQL-Befehl schreiben, um mehrere Spalten aus einer einzigen Tabelle in einer ALTER TABLE Erklärung.

Von MSDN's ALTER TABLE Dokumentation ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Gibt an, dass constraint_name oder column_name aus der Tabelle entfernt wird. DROP COLUMN ist nicht erlaubt, wenn die Kompatibilitätsebene 65 oder früher ist. Es können mehrere Spalten und Beschränkungen aufgelistet werden.

Es heißt, dass mehrere Spalten in der Anweisung aufgeführt werden können, aber die Syntax zeigt kein optionales Komma oder irgendetwas, das auch nur einen Hinweis auf die Syntax geben könnte.

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

578voto

Alex Aza Punkte 73463

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 COLUMN est optional und kann weggelassen werden, außer bei RENAME COLUMN (zur Unterscheidung eines Vorgangs zur Spaltenumbenennung von der RENAME Umbenennung der Tabelle). Mehr Infos ici .

239voto

Denis Rozhnev Punkte 2417

Zusammenfassend

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;

Aufmerksam sein

DROP COLUMN nicht physisch die Daten für einige DBMS zu entfernen. Z.B. für MS SQL. Für Typen mit fester Länge ( int , numerisch , Schwimmer , datetime , eindeutiger Bezeichner usw.) wird der Platz auch für Datensätze verbraucht, die nach dem Wegfall der Spalten hinzugefügt wurden. Um den verschwendeten Platz loszuwerden, machen Sie ALTER TABLE ... REBUILD .

49voto

Remus Rusanu Punkte 280155
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 dass bei Typen mit fester Länge (int, numeric, float, datetime, uniqueidentifier usw.) der Platz auch für Datensätze verbraucht wird, die nach dem Löschen der Spalten hinzugefügt wurden. Um den verschwendeten Platz loszuwerden, führen Sie Folgendes aus ALTER TABLE ... REBUILD .

14voto

MANISH ZOPE Punkte 1153

Es mag spät sein, aber ich teile es für die neuen Benutzer, die diese Frage besuchen. Um mehrere Spalten zu löschen, lautet die eigentliche Syntax

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

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

5voto

Martin Brown Punkte 23597

Die von Microsoft spezifizierte Syntax für das Fallenlassen einer Spalte in einem ALTER Aussage ist diese

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

Beachten Sie, dass das [,...n] sowohl nach dem Spaltennamen als auch am Ende der gesamten Drop-Klausel erscheint. Das bedeutet, dass es zwei Möglichkeiten gibt, mehrere Spalten zu löschen. Sie können entweder so vorgehen:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

oder dies

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 wollen:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Wenn Spalten gelöscht werden, nimmt SQL Sever den von den gelöschten Spalten belegten Platz nicht wieder ein. Bei Datentypen, die inline in den Zeilen gespeichert werden (z. B. int), kann es sogar dazu kommen, dass die neuen Zeilen, die nach der alter-Anweisung hinzugefügt werden, Platz benötigen. Um dies zu umgehen, müssen Sie einen geclusterten Index auf der Tabelle erstellen oder den geclusterten Index neu aufbauen, wenn er bereits einen hat. Die Wiederherstellung des Indexes kann mit einem REBUILD-Befehl nach der Änderung der Tabelle erfolgen. Aber seien Sie gewarnt, dass dies bei sehr großen Tabellen sehr langsam sein kann. Zum Beispiel:

ALTER TABLE Test
    REBUILD;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X