Làm cách nào để thả khóa ngoại trong SQL Server?


201

Tôi đã tạo khóa ngoại (trong SQL Server) bằng cách:

alter table company add CountryID varchar(3);
alter table company add constraint Company_CountryID_FK foreign key(CountryID) 
references Country;

Sau đó tôi chạy truy vấn này:

alter table company drop column CountryID;

và tôi nhận được lỗi này:

Msg 5074, Cấp 16, Bang 4, Dòng 2
Đối tượng 'Company_CountryID_FK' phụ thuộc vào cột 'CountryID'.
Msg 4922, Cấp 16, Bang 9, Dòng 2
ALTER TABLE DROP COLUMN CountryID không thành công vì một hoặc nhiều đối tượng truy cập vào cột này

Tôi đã thử điều này, nhưng nó dường như không hoạt động:

alter table company drop foreign key Company_CountryID_FK; 
alter table company drop column CountryID;

Tôi cần làm gì để thả CountryIDcột?

Cảm ơn.


2
Lỗi gì khi bạn cố gắng đánh rơi khóa ngoại?
ddc0660

2
Chỉ cần lưu ý rằng thật nguy hiểm khi bỏ một ràng buộc khóa ngoại mà không biết tại sao nó lại xuất hiện ngay từ đầu. Nếu bạn chỉ tạo ra điều này và làm điều đó do nhầm lẫn thì hãy sử dụng mã được cung cấp trong các câu trả lời khác. Nếu không, sau đó không bỏ ràng buộc cho đến khi bạn chắc chắn rằng bạn sẽ không phá vỡ điều gì khác bằng cách làm như vậy. Các ràng buộc được tạo ra để thực thi các quy tắc bận rộn và tốt hơn là chắc chắn rằng chúng không còn cần thiết trước khi bỏ chúng.
HLGEM


Cú pháp bỏ FK của bạn không cần từ "khóa ngoại". Đây là cú pháp cho MySQL, không phải SQL Server. Bạn có thể thay thế nó bằng từ "ràng buộc".
John Gilmer

Câu trả lời:


314

Thử

alter table company drop constraint Company_CountryID_FK


alter table company drop column CountryID

49

Điều này sẽ làm việc:

ALTER TABLE [dbo].[company] DROP CONSTRAINT [Company_CountryID_FK]

23

Tôi nghĩ rằng điều này sẽ hữu ích cho bạn ...

DECLARE @ConstraintName nvarchar(200)
SELECT 
    @ConstraintName = KCU.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
    ON KCU.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG  
    AND KCU.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
    AND KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
WHERE
    KCU.TABLE_NAME = 'TABLE_NAME' AND
    KCU.COLUMN_NAME = 'TABLE_COLUMN_NAME'
IF @ConstraintName IS NOT NULL EXEC('alter table TABLE_NAME drop  CONSTRAINT ' + @ConstraintName)

Nó sẽ xóa ràng buộc khóa ngoại dựa trên bảng và cột cụ thể.


2
Cảm ơn Samir. Đại khái.
kuklei

19

Đầu tiên kiểm tra sự tồn tại của các ràng buộc sau đó thả nó.

if exists (select 1 from sys.objects where name = 'Company_CountryID_FK' and type='F')
begin
alter table company drop constraint  Company_CountryID_FK
end

11
alter table company drop constraint Company_CountryID_FK

4

Tôi không biết MSSQL nhưng sẽ không được:

alter table company drop **constraint** Company_CountryID_FK;

1

Bạn cũng có thể Nhấp chuột phải vào bảng, chọn sửa đổi, sau đó chuyển đến thuộc tính, nhấp chuột phải vào nó và chọn thả khóa chính.


1

Bạn đang cố gắng để giảm ràng buộc FK hoặc chính cột?

Để loại bỏ các ràng buộc:

alter table company drop constraint Company_CountryID_FK

Bạn sẽ không thể thả cột cho đến khi bạn bỏ ràng buộc.

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.