2012-03-05 13 views

Trả lời

12

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

+1

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

3

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ó.

1

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.

4

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 MyTableMyReferencedTable:

-- 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 
-3

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.

+0

Đây không phải là cài đặt SQL Server hợp lệ. –

+0

Điều này là dành cho MySQL và không phải SqlServer. –