Bagaimana cara menghapus kolom dari tabel yang ada?

386

Bagaimana cara menghapus kolom dari tabel yang ada?

Saya punya meja MENdengan FnamedanLname

Saya perlu menghapus Lname

Bagaimana cara melakukannya?

Gali
sumber
12
kemungkinan duplikat menghapus kolom di MS SQL Server 2005
rene
1
Kemungkinan duplikat menghapus kolom di MS SQL Server
Saya Orang yang Paling Bodoh

Jawaban:

661
ALTER TABLE MEN DROP COLUMN Lname
jcomeau_ictx
sumber
157

Umum:

ALTER TABLE table_name DROP COLUMN column_name;

Dalam kasus Anda:

ALTER TABLE MEN DROP COLUMN Lname;
reggie
sumber
72

Contoh Anda sederhana dan tidak memerlukan perubahan tabel tambahan tetapi secara umum ini tidak sepele.

Jika kolom ini direferensikan oleh tabel lain maka Anda perlu mencari tahu apa yang harus dilakukan dengan tabel / kolom lainnya. Salah satu opsi adalah menghapus kunci asing dan menyimpan data yang dirujuk di tabel lain.

Pilihan lain adalah menemukan semua kolom referensi dan menghapusnya juga jika tidak diperlukan lagi.

Dalam kasus seperti itu tantangan sebenarnya adalah menemukan semua kunci asing. Anda dapat melakukan ini dengan menanyakan tabel sistem atau menggunakan alat pihak ketiga seperti Pencarian ApexSQL (gratis) atau pelacak Ketergantungan Gerbang Merah (premium tetapi lebih banyak fitur). Ada seluruh utas pada kunci asing di sini

John Moore
sumber
47

Ini jawaban yang benar:

ALTER TABLE MEN DROP COLUMN Lname

Tapi ... jika CONSTRAINTada pada COLUMN, maka Anda harus DROPyang CONSTRAINTpertama, maka Anda akan dapat DROPdengan COLUMN. Untuk menjatuhkan CONSTRAINT, jalankan:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
Aaron Lelevier
sumber
ALTER TABLE tb_name DROP FOREIGN KEY key_name
bortunac
3
CARA-TO mencari constraintuntuk Kolom ?
Kiquenet
21

Di SQL Server 2016 Anda bisa menggunakan pernyataan DIE baru.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Kueri di atas adalah menjalankan kembali dropskolomnya hanya jika ituexists dalam tabel yang lain itu tidak akan membuang kesalahan.

Alih-alih menggunakan IFpembungkus besar untuk memeriksa keberadaan columnsebelum menjatuhkannya, Anda bisa menjalankan DDLpernyataan di atas

P ரதீப்
sumber
3
Apa pernyataan DIE ?
Kiquenet
3
Ngomong-ngomong, Anda dapat memanggil jenis skrip / fungsi "re-runnable" ini Idempotent
tomosius
4
ini harus menjadi jawaban yang diterima. Jika Anda memiliki skrip sql otomatis menyebarkan Anda harus menulis skrip Anda defensif seperti ini.
pemenang
7

Pertanyaannya adalah, bisakah Anda hanya menghapus kolom dari tabel yang tidak ada ;-)

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  
Tad
sumber
1
Saya kira jika Anda ingin menjatuhkan kolom dari meja yang tidak ada, ini akan menjadi cara untuk melakukannya
Matiaan
6

Jawaban sederhana untuk ini adalah menggunakan ini:

ALTER TABLE MEN DROP COLUMN Lname;

Lebih dari satu kolom dapat ditentukan seperti ini:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

Dari SQL Server 2016 juga dimungkinkan untuk hanya menjatuhkan kolom hanya jika ada. Ini menghentikan Anda mendapatkan kesalahan saat kolom tidak ada yang mungkin tidak Anda pedulikan.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

Ada beberapa prasyarat untuk menjatuhkan kolom. Kolom yang dijatuhkan tidak boleh:

  • Digunakan oleh Indeks
  • Digunakan oleh PERIKSA, batasan KUNCI ASING, UNIK, atau KUNCI UTAMA
  • Terkait dengan DEFAULT
  • Terikat aturan

Jika salah satu di atas benar, Anda harus menghentikan asosiasi tersebut terlebih dahulu.

Juga, harus dicatat, bahwa menjatuhkan kolom tidak merebut kembali ruang dari hard disk sampai indeks tabel berkerumun dibangun kembali. Karena itu, sering kali ide yang baik untuk mengikuti hal di atas dengan perintah tabel rebuild seperti ini:

ALTER TABLE MEN REBUILD;

Akhirnya karena beberapa orang mengatakan ini bisa lambat dan mungkin akan mengunci tabel selama durasi. Dimungkinkan untuk membuat tabel baru dengan struktur yang diinginkan dan kemudian mengganti nama seperti ini:

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;

Tapi berhati-hatilah ada jendela untuk kehilangan data dari baris yang disisipkan di sini antara perintah pilih pertama dan nama ganti terakhir.

Martin Brown
sumber
2

Untuk menambahkan kolom di tabel yang ada:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

Untuk menghapus kolom di tabel yang ada:

ALTER TABLE table_name
DROP COLUMN column_name
mithun
sumber
Pertanyaan bukan tentang kolom ADD .
Kiquenet
2

Ini juga dapat dilakukan melalui GUI SSMS. Yang menyenangkan tentang metode ini adalah memperingatkan Anda jika ada hubungan pada kolom itu dan juga dapat secara otomatis menghapusnya juga.

  1. Letakkan tabel dalam tampilan Desain (klik kanan pada tabel) seperti:

masukkan deskripsi gambar di sini

  1. Klik kanan pada kolom dalam tampilan Desain tabel dan klik "Hapus Kolom"

masukkan deskripsi gambar di sini

Seperti yang saya katakan sebelumnya, jika ada hubungan yang juga perlu dihapus, ia akan menanyakan kepada Anda pada saat ini apakah Anda ingin menghapusnya juga. Anda mungkin perlu melakukannya untuk menghapus kolom.

Tony L.
sumber
0

Jika Anda menggunakan C # dan kolom Identity adalah int, buat instance baru int tanpa memberikan nilai apa pun padanya. Itu berhasil bagi saya.

[identity_column] = int baru ()

EA Lehn
sumber
Apa jawaban ini akan dilakukan? Apakah akan menghapus kolom dari tabel?
Prashant Pimpale
0

Sintaksis:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Sebagai contoh:

alter table Employee drop column address;
Anand Pipalwa
sumber