Làm thế nào để loại bỏ một cột khỏi một bảng hiện có?
Tôi có một cái bàn MEN
với Fname
vàLname
Tôi cần phải loại bỏ Lname
Làm thế nào để làm nó?
Làm thế nào để loại bỏ một cột khỏi một bảng hiện có?
Tôi có một cái bàn MEN
với Fname
vàLname
Tôi cần phải loại bỏ Lname
Làm thế nào để làm nó?
Câu trả lời:
ALTER TABLE MEN DROP COLUMN Lname
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
Đây là câu trả lời chính xác:
ALTER TABLE MEN DROP COLUMN Lname
Nhưng ... nếu một CONSTRAINT
tồn tại trên COLUMN
, sau đó bạn phải DROP
là CONSTRAINT
đầu tiên, sau đó bạn sẽ có thể để DROP
các COLUMN
. Để thả a CONSTRAINT
, hãy chạy:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
cho một cột ?
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ó drops
cột chỉ khi nó exists
trong bảng khác nó sẽ không ném lỗi.
Thay vì sử dụng các IF
hàm bao lớn để kiểm tra sự tồn tại của column
trước khi thả nó, bạn chỉ có thể chạy DDL
câu lệnh trên
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
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à:
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.
Đ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.
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.
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ú pháp:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Ví dụ:
alter table Employee drop column address;