SQL Server'da tek bir ALTER TABLE deyimi ile birden çok sütun DROP nasıl?


292

Bir ALTER TABLEifadede tek bir tablodan birden çok sütun bırakmak için tek bir SQL komutu yazmak istiyorum .

Gönderen MSDN'ın ALTER tablo belgelerinde ...

DROP { [CONSTRAINT] constraint_name | COLUMN column_name }

Kısıt_adı veya sütun_adı'nın tablodan kaldırıldığını belirtir. Uyumluluk seviyesi 65 veya daha eski ise DÜŞME SÜTUNUNA izin verilmez. Birden çok sütun ve kısıtlama listelenebilir.

Çoklu sütunların ifadede listelenebileceğini, ancak sözdiziminin isteğe bağlı bir virgül ya da sözdiziminde ipucu verecek herhangi bir şey göstermediğini söylüyor.

Bir ifadede birden fazla sütun bırakmak için SQL'imi nasıl yazmalıyım (mümkünse)?

Yanıtlar:


431

SQL Server için:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2;

Sözdizimi

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

MySQL için:

ALTER TABLE TableName
    DROP COLUMN Column1,
    DROP COLUMN Column2;

ya da bunun gibi 1 :

ALTER TABLE TableName
    DROP Column1,
    DROP Column2;

1. kelime COLUMNolduğu isteğe bağlı ve hariç olmak üzere, göz ardı edilebilir RENAME COLUMN(bir kolon-adlandırma işlem ayırt RENAMEmasa adlandırma işlemi). Daha fazla bilgi burada .


1
@Gweebz - Sahip olduğunuz hatanın sütun kullanımıyla ilgili olduğunu varsayıyorum. Sütun, bir kısıtlama, dizin veya başka bir hesaplanmış sütunda kullanılabilir.
Alex Aza

Tam; sahip olduğum ikinci sütun bir Dizin'de kullanıldı. Bu Index'i bıraktım ve DROP ifadem bundan sonra mükemmel çalıştı.
Jesse Webb

@jeicam - Büyük olasılıkla bu olurdu, çünkü bırakmaya çalıştığınız sütunlardan 1'i birincil anahtar olabilir.
Benny

196

Özetleme

Oracle :

ALTER TABLE table_name DROP (column_name1, column_name2);

MS SQL Sunucusu :

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;

Farkında olmak

DROP COLUMNgelmez fiziksel bazı DBMS için verileri kaldırmak. Örneğin MS SQL için. Sabit uzunluk türleri için ( int , sayısal , kayan nokta , tarih / saat , benzersiz tanımlayıcı vb.) Sütunlar bırakıldıktan sonra eklenen kayıtlar için bile alan tüketilir. Boşa giden alandan kurtulmak için yapın ALTER TABLE ... REBUILD.


3
PostgreSQL COLUMNiçin MySql'deki gibi anahtar kelimeyi bile atlayabilirsiniz .
Artem Novikov

1
MySQL için MS SQL ve Postgre SQL ile aynı biçimi kullanabilirsiniz: ALTER TABLE tablo_adı DROP COLUMN sütun_adı1, sütun_adı2;
jciloa

Yanıtları diğer DB satıcılarına genişlettiğiniz için teşekkür ederiz!
KJP

39
create table test (a int, b int , c int, d int);
alter table test drop column b, d;

DÜŞME SÜTUNUN verileri fiziksel olarak kaldırmaz ve sabit uzunluk türleri (int, sayısal, kayan nokta, tarih-saat, benzersiz tanımlayıcı vb.) İçin, sütunlar bırakıldıktan sonra eklenen kayıtlar için bile alan tüketilir. Boşa giden alandan kurtulmak için yapın ALTER TABLE ... REBUILD.


11
Tablo boyutları ve REBUILD gerektiren not için +1. Referans olarak belgelere bir bağlantı sağlayabilir misiniz?
Jesse Webb


4
DBA'mla bir REBUILD yapma hakkında konuştum ve tablonun kümelenmiş bir Endeksi (benimki yaptı) ALTER INDEX PK_IndexName ON TableName REBUILDolsaydı , sadece koşabileceğimi ve alanı geri kazanacağını söyledi. Bu biraz burada açıklanmıştır: "Bir Dizini Yeniden Oluşturma" bölümü altında msdn.microsoft.com/en-us/library/ms189858.aspx .
Jesse Webb

1
Herkes neden böyle uygulanabileceğine ışık tutabilir? Sütunu düşürürsem, dizinler, veriler ve bu sütun üzerine inşa edilen her şeyin gitmesini beklerim. Uyarı yapmadan boşluk bırakmak, kötü uygulama gibi görünüyor mu yoksa bir şey mi kaçırıyorum?
DanteTheSmith

13

Bu gecikebilir, ancak bu soruyu ziyaret eden yeni kullanıcılar için paylaşılabilir. Birden çok sütunu bırakmak için gerçek sözdizimi

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

Yani her sütun için Mysql 5.0.45 içinde "bırak sütun" belirtmeniz gerekir.


Bu yanlış sözdizimidir. Kullanım: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme

1
@ Sözdizimi doğru, ben test ve ben kullanırsanız çalışır, çalışır: ALTER TABLE Test DROP COLUMN c1, c2; Mysql bir hata veriyor. ... c2 yakınındaki
Tom Mwenda

6
@TomBikiNurse Soru bir MSDN referansına sahiptir, bu nedenle söz konusu SQL'in MySQL ile değil MS SQL Server ile ilgili olduğu varsayılmıştır
Surya Pratap

bu gerçek sözdizimidir. daha iyi oylanan cevaplar yanlıştır.
Vardumper

@SuryaPratap Soru, son paragrafta 'SQL'im'den bahsediyor.
Ebedi21

4

Microsoft tarafından bir ALTER deyiminin sütun kısmını bırakmak için belirtildiği gibi sözdizimi şudur:

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

[, ... n] öğesinin hem sütun adından sonra hem de tüm bırakma tümcesinin sonunda göründüğüne dikkat edin. Bunun anlamı, birden çok sütunu silmenin iki yolu olmasıdır. Bunu da yapabilirsiniz:

ALTER TABLE TableName
    DROP COLUMN Column1, Column2, Column3

veya bu

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

Bu ikinci sözdizimi, bir sütunun düşmesini bir kısıtlama bırakarak birleştirmek istiyorsanız kullanışlıdır:

ALTER TBALE TableName
    DROP
        CONSTRAINT DF_TableName_Column1,
        COLUMN Column1;

Sütunları bırakırken SQL Sever bırakılan sütunların kapladığı alanı geri almaz. Satırlarda satır içi olarak depolanan veri türleri için (örneğin int), alter ifadesinden sonra eklenen yeni satırlarda bile yer kaplayabilir. Bu sorunu aşmak için, tablo üzerinde kümelenmiş bir dizin oluşturmanız veya zaten varsa kümelenmiş dizini yeniden oluşturmanız gerekir. Dizini yeniden oluşturma tabloyu değiştirdikten sonra bir REBUILD komutuyla yapılabilir. Ancak bu çok büyük masalarda yavaş olabileceği konusunda uyarılmalıdır. Örneğin:

ALTER TABLE Test
    REBUILD;

3

MySQL (sürüm 5.6) için, tek bir dropdurumla birden çok sütun bırakma gerçekleştiremezsiniz, bunun yerine birden çok dropdurumla karşılaşamazsınız:

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> 

BTW, yukarıda gördüğünüz gibi drop <col_name>kısaltılmıştır .drop column <col_name>drop c3


2

Aşağıdaki sözdizimini silmek yalnızca tek bir sütunsa çalışır

ALTER TABLE tablename DROP COLUMN column1;

Birden fazla sütunu silmek için, DROP COLUMNçalışmazsa kullanarak aşağıdaki sözdizimi çalışır

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


1
alter table tablename drop (column1, column2, column3......);

Bu yanlış sözdizimidir. Kullanım: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme

1

jenerik:

ALTER TABLE table_name 
DROP COLUMN column1,column2,column3;

Örneğin:

ALTER TABLE Student 
DROP COLUMN Name, Number, City;

0

bu sorgu birden çok sütun testini değiştirir.

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

alter table test drop(a,B);

Bu yanlış sözdizimidir. Kullanım: ALTER TABLE Test DROP COLUMN c1, c2;
Graeme

0
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;

MySQL DB için.

Veya aynı satırda değişiklik yaparken sütun ekleyebilirsiniz:

ALTER table table_name Drop column column1, ADD column column2 AFTER column7;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.