Làm thế nào để loại bỏ một cột khỏi một bảng hiện có?


Câu trả lời:



157

Chung:

ALTER TABLE table_name DROP COLUMN column_name;

Trong trường hợp của bạn:

ALTER TABLE MEN DROP COLUMN Lname;

72

Ví dụ của bạn rất đơn giản và không yêu cầu bất kỳ thay đổi bảng bổ sung nào nhưng nói chung điều này không quá tầm thường.

Nếu cột này được tham chiếu bởi các bảng khác thì bạn cần phải biết phải làm gì với các bảng / cột khác. Một tùy chọn là loại bỏ khóa ngoại và giữ dữ liệu được tham chiếu trong các bảng khác.

Một tùy chọn khác là tìm tất cả các cột tham chiếu và loại bỏ chúng nếu không cần thiết nữa.

Trong những trường hợp như vậy, thách thức thực sự là tìm tất cả các khóa ngoại. Bạn có thể thực hiện việc này bằng cách truy vấn các bảng hệ thống hoặc sử dụng các công cụ của bên thứ ba như ApexQuery Search (miễn phí) hoặc trình theo dõi phụ thuộc Red Gate (cao cấp nhưng nhiều tính năng hơn). Có một chủ đề về khóa ngoại ở đây


47

Đây là câu trả lời chính xác:

ALTER TABLE MEN DROP COLUMN Lname

Nhưng ... nếu một CONSTRAINTtồn tại trên COLUMN, sau đó bạn phải DROPCONSTRAINTđầu tiên, sau đó bạn sẽ có thể để DROPcác COLUMN. Để thả a CONSTRAINT, hãy chạy:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

THAY ĐỔI BẢNG tb_name DROP NGOẠI TỪ KHÓA key_name
bortunac

3
HƯỚNG DẪN tìm kiếm constraintcho một cột ?
Kiquenet

21

Trong SQL Server 2016, bạn có thể sử dụng các câu lệnh DIE mới.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

Truy vấn trên có thể chạy lại nó dropscột chỉ khi nó existstrong bảng khác nó sẽ không ném lỗi.

Thay vì sử dụng các IFhàm bao lớn để kiểm tra sự tồn tại của columntrước khi thả nó, bạn chỉ có thể chạy DDLcâu lệnh trên


3
Có gì báo cáo DIE ?
Kiquenet

3
Nhân tiện, bạn có thể gọi các loại kịch bản / chức năng "có thể chạy lại" này là Idempotent
tomosius

4
đây sẽ là câu trả lời được chấp nhận Nếu bạn có tập lệnh sql tự động triển khai, bạn phải viết các tập lệnh của bạn một cách phòng thủ như thế này.
người chiến thắng

7

Câu hỏi là, bạn chỉ có thể xóa một cột khỏi một bảng chưa có ;-)

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
Tôi cho rằng nếu bạn muốn thả một cột từ một bảng chưa có, đây sẽ là cách để làm điều đó
Matiaan

6

Câu trả lời đơn giản cho việc này là sử dụng cái này:

ALTER TABLE MEN DROP COLUMN Lname;

Nhiều cột có thể được chỉ định như thế này:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

Từ SQL Server 2016, chỉ có thể thả cột chỉ khi nó tồn tại. Điều này ngăn bạn gặp lỗi khi cột không tồn tại, đây là điều bạn có thể không quan tâm.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

Có một số điều kiện tiên quyết để thả cột. Các cột bị rớt không thể là:

  • Được sử dụng bởi một chỉ mục
  • Được sử dụng bởi các ràng buộc CHECK, FOREIGN KEY, UNIITE hoặc PRIMARY KEY
  • Liên kết với một DEFAULT
  • Giới hạn một quy tắc

Nếu bất kỳ điều nào ở trên là đúng, bạn cần bỏ các liên kết đó trước.

Ngoài ra, cần lưu ý rằng việc thả một cột không lấy lại khoảng trống từ đĩa cứng cho đến khi chỉ mục cụm của bảng được xây dựng lại. Vì vậy, thường là một ý tưởng tốt để làm theo cách trên với lệnh xây dựng lại bảng như thế này:

ALTER TABLE MEN REBUILD;

Cuối cùng như một số người đã nói điều này có thể chậm và có thể sẽ khóa bảng trong suốt thời gian. Có thể tạo một bảng mới với cấu trúc mong muốn và sau đó đổi tên như thế này:

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;

Nhưng được cảnh báo rằng có một cửa sổ để mất dữ liệu của các hàng được chèn ở đây giữa lệnh chọn đầu tiên và lệnh đổi tên cuối cùng.


2

Để thêm các cột trong bảng hiện có:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

Để xóa các cột trong bảng hiện có:

ALTER TABLE table_name
DROP COLUMN column_name

Câu hỏi không về cột THÊM .
Kiquenet

2

Điều này cũng có thể được thực hiện thông qua GUI SSMS. Điều thú vị về phương pháp này là nó cảnh báo bạn nếu có bất kỳ mối quan hệ nào trên cột đó và cũng có thể tự động xóa chúng.

  1. Đặt bảng trong dạng xem Thiết kế (nhấp chuột phải vào bảng) như vậy:

nhập mô tả hình ảnh ở đây

  1. Nhấp chuột phải vào cột trong dạng xem Thiết kế của bảng và nhấp vào "Xóa Cột"

nhập mô tả hình ảnh ở đây

Như tôi đã nói trước đây, nếu có bất kỳ mối quan hệ nào cũng cần phải xóa, nó sẽ hỏi bạn vào thời điểm này nếu bạn muốn xóa những mối quan hệ đó. Bạn có thể sẽ cần phải làm như vậy để xóa cột.


0

Nếu bạn đang sử dụng C # và cột Danh tính là int, hãy tạo một thể hiện mới của int mà không cung cấp bất kỳ giá trị nào cho nó. Nó hoạt động với tôi.

[nhận dạng_column] = new int ()


Câu trả lời này sẽ làm gì? Nó sẽ loại bỏ cột khỏi bảng?
Pashale Prashant

0

Cú pháp:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Ví dụ:

alter table Employee drop column address;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.