Tôi nhận được thông báo sau ngay cả khi bảng tham chiếu nó trống: "Không thể cắt ngắn bảng 'dbo.Link' bởi vì nó đang được tham chiếu bởi một ràng buộc KEY NGOẠI HỐI "Dường như không có nhiều ý nghĩa tại sao điều này xảy ra. Bất kỳ đề xuất?Không thể cắt bớt bảng vì nó đang được tham chiếu bởi một ràng buộc KEY NGOÀI
Trả lời
Trong SQL Server, bảng được tham chiếu bởi một FK không thể bị cắt bớt ngay cả khi tất cả các bảng tham chiếu trống hoặc khóa ngoài bị tắt.
Bạn cần phải sử dụng DELETE
(có thể yêu cầu đăng nhập nhiều hơn nữa) hoặc thả các mối quan hệ (s) trước khi sử dụng TRUNCATE
và tạo lại chúng sau đó hoặc xem cách giải quyết trên this connect item cho một cách để đạt được điều này bằng ALTER TABLE ... SWITCH
Thực hiện truy vấn sau đây để tìm kiếm bất kỳ hạn chế:
use MyDatabase
select c.name as c_name, t.name as t_name
from sys.key_constraints c
join sys.tables t on t.object_id = c.parent_object_id
Nếu bất kỳ hạn chế được tìm thấy trên bàn của bạn, loại bỏ nó.
Nếu bạn nhận được lỗi này và bạn cần phải cắt bớt bảng, sau đó giải pháp thay thế có thể là bạn có thể thả và tạo lại bảng cùng với primary/other_keys/indexes/triggers
. Vui lòng đảm bảo rằng bạn không cần dữ liệu trong bảng đó.
Linh hồn này đang hoạt động như một sự quyến rũ đối với tôi và hầu như không mất một phút để hoàn thành. Tôi đang làm nó cho mục đích che giấu.
Bạn không thể cắt bớt một bảng có ràng buộc FK trên đó. Giải pháp thay thế, bạn có thể: 1/Thả các ràng buộc 2/Cắt bảng 3/Tạo lại các ràng buộc.
Ở đây nó là liên quan đến kịch bản T-SQL, giả như bạn có 2 bảng gọi MyTable và MyReferencedTable:
-- Remove constraint
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable')
BEGIN
ALTER TABLE dbo.MyReferencedTable
DROP CONSTRAINT FK_MyReferencedTable_MyTable
END
-- Truncate table
TRUNCATE TABLE dbo.MyTable
-- Re-Add constraint
IF NOT EXISTS(SELECT 1 FROM sys.foreign_keys WHERE name = 'FK_MyReferencedTable_MyTable')
BEGIN
ALTER TABLE dbo.MyReferencedTable
WITH CHECK ADD CONSTRAINT [FK_MyReferencedTable_MyTable] FOREIGN KEY(ListingKey)
REFERENCES dbo.MyTable (ListingKey)
END
Thay vì xóa hoặc tái tạo lại khó khăn, tôi thích cách đơn giản này. Vô hiệu hóa xác nhận hạn chế bằng cách thực hiện các truy vấn sau đây đầu tiên:
SET FOREIGN_KEY_CHECKS=0;
Sau đó, cắt ngắn bảng của bạn
Và cuối cùng, kích hoạt lại xác nhận hạn chế:
SET FOREIGN_KEY_CHECKS=1;
Thats một giải pháp phổ biến khi bạn di chuyển cơ sở dữ liệu, vì vậy bạn không phải lo lắng về thứ tự các bảng được chèn vào.
Đây không phải là cài đặt SQL Server hợp lệ. –
Điều này là dành cho MySQL và không phải SqlServer. –
thats nghe có vẻ khá kém tính năng của sản phẩm. nhưng tôi đoán sẽ cần phải yếu tố đó vào mã. thanks – stats101