2010-09-23 24 views
40

Tôi cố gắng để cắt xén một bảng với các phím nước ngoài và nhận được thông báo:tôi đã nhận lỗi "Câu lệnh DELETE mâu thuẫn với các hạn chế THAM KHẢO"

"Không thể cắt bảng bởi vì nó đang được tham chiếu bởi một KEY NƯỚC NGOÀI ràng buộc ".

Tôi đọc rất nhiều tài liệu về vấn đề này và nghĩ rằng tôi tìm thấy giải pháp bằng cách sử dụng xóa

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0) 

Nhưng tôi vẫn nhận được một thông báo lỗi:

"Các DELETE tuyên bố mâu thuẫn với ràng buộc REFERENCE ".

Khi tôi cố gắng xóa với Microsoft Management Studio và thực hiện truy vấn trước đó

DELETE FROM table_name DBCC CHECKIDENT (table_name, RESEED, 0) 

nó không đưa ra một lỗi và hoạt động đúng. Tôi muốn xóa tất cả các thông tin từ một bảng và thêm mới vào nó, nhưng tôi không muốn thả và tạo ra các khóa nước ngoài.

Trả lời

6

Bạn đang cố gắng xóa một hàng được tham chiếu bởi một hàng khác (có thể trong một bảng khác).

Bạn cần xóa rằng trước tiên hàng (hoặc ít nhất đặt lại khóa ngoại của nó cho một thứ khác), nếu không bạn sẽ kết thúc bằng một hàng tham chiếu đến hàng không tồn tại. Cơ sở dữ liệu cấm điều đó.

+0

Tôi đã giải quyết được sự cố của mình khi xóa mọi hàng khỏi bảng "con" và sau khi xóa tất cả các hàng khỏi bảng "cha mẹ". Nhưng vẫn còn một số câu hỏi :) như "** Khi tôi đang cố gắng để xóa với studio quản lý microsoft và thực hiện các truy vấn trước đó (ví dụ DELETE FROM table_name DBCC CHECKIDENT (tên_bảng, RESEED, 0)) nó đã không đưa ra một lỗi nó làm việc ** " – Peter

40

Lỗi có nghĩa là bạn có dữ liệu trong các bảng khác tham chiếu đến dữ liệu bạn đang cố xóa.

Bạn sẽ cần phải thả và tạo lại các ràng buộc hoặc xóa dữ liệu mà khóa ngoài tham chiếu.

Giả sử bạn có bảng sau

dbo.Students 
(
StudentId 
StudentName 
StudentTypeId 
) 


dbo.StudentTypes 
(
StudentTypeId 
StudentType 
) 

Giả sử một ràng buộc khoá ngoại tồn tại giữa StudentTypeId cột trong StudentTypesStudentTypeId cột trong Students

Nếu bạn cố gắng để xóa tất cả các dữ liệu trong StudentTypes một lỗi sẽ xảy ra dưới dạng cột StudentTypeId trong Students tham chiếu dữ liệu trong bảng StudentTypes.

EDIT:

DELETETRUNCATE về cơ bản làm điều tương tự. Sự khác biệt duy nhất là TRUNCATE không lưu các thay đổi vào tệp Nhật ký. Ngoài ra, bạn không thể sử dụng điều khoản WHERE với TRUNCATE

Vì sao bạn có thể chạy điều này trong SSMS nhưng không thông qua Ứng dụng của bạn. Tôi thực sự không thể thấy điều này xảy ra. Ràng buộc FK sẽ vẫn ném một lỗi bất kể giao dịch bắt nguồn từ đâu.

+0

Cảm ơn, tôi sẽ cố gắng xóa bảng" con "đầu tiên và sau đó là chủ. Nó sẽ hoạt động nếu tôi sử dụng TRUNCATE thay vì DELETE. Bạn có thể cho tôi biết lý do tại sao trong MS quản lý phòng thu tôi có thể xóa các hàng từ bảng với cùng một truy vấn đó là cho tôi lỗi khi tôi thử nó với ứng dụng – Peter

+0

@Peter - Tôi đã cập nhật câu trả lời của tôi – codingbadger

+4

Đó là xa "sự khác biệt duy nhất" , ví dụ truncate không thể xảy ra nếu có bất kỳ tài liệu tham khảo nào cả. Và cắt ngắn không thể xảy ra trong một giao dịch trên hầu hết các hệ thống. Và cắt ngắn không thể xảy ra như là một phần của một thủ tục được lưu trữ. Và truncate phải ở trong một lô riêng biệt trong hầu hết các hệ thống. Và truncate không thể kích hoạt. –

1

Để DELETE, mà không thay đổi các tham chiếu, trước tiên bạn nên xóa hoặc thay đổi (theo cách phù hợp với mục đích của bạn) tất cả các hàng có liên quan trong các bảng khác.

Để TRUNCATE bạn phải xóa tham chiếu. TRUNCATE là một câu lệnh DDL (có thể so sánh với CREATE và DROP) không phải là một câu lệnh DML (như INSERT và DELETE) và không gây ra các trigger, cho dù là rõ ràng hay liên kết với các tham chiếu và các ràng buộc khác. Bởi vì điều này, cơ sở dữ liệu có thể được đưa vào trạng thái không nhất quán nếu TRUNCATE được cho phép trên các bảng có tham chiếu. Đây là một quy tắc khi TRUNCATE là một phần mở rộng cho tiêu chuẩn được sử dụng bởi một số hệ thống, và được bắt buộc theo tiêu chuẩn, bây giờ nó đã được thêm vào.

9

Bạn đã cân nhắc áp dụng ON DELETE CASCADE nếu có liên quan?

Các vấn đề liên quan