2012-01-31 19 views
7

Tôi có một bảng mà trường chính của nó "ID" lĩnh vực được sử dụng trong nhiều bảng khác như là chìa khóa nước ngoài.cách kiểm tra xem một khóa của bản ghi có được sử dụng trong các bảng khác dưới dạng khóa ngoài (sql) không?

Làm cách nào tôi có thể nhận ra rằng bản ghi từ bảng này (ví dụ: bản ghi đầu tiên "ID = 1") được sử dụng trong bảng khác?

Tôi không muốn chọn từ tất cả các bảng khác để hiểu nó gây ra các bảng rất nhiều và quan hệ. Tôi tìm kiếm một giải pháp, không có giải pháp làm việc hoặc tôi đã nhận nó sai. Hãy giúp tôi.

+2

Bạn cần biết điều này để làm gì? Để không xóa một bản ghi nếu nó đang được sử dụng như một FK? Sau đó, đặt các khóa ngoại của các bảng khác thành "ON DELETE RESTRICT" thay vì "CASCADE". Bùng nổ, không còn vô tình xóa. –

+0

Tôi có một trường Isdeleted mà tôi làm cho nó đúng nếu bất kỳ hồ sơ khác sử dụng ID hồ sơ này là khóa ngoại nhưng nếu ID của hồ sơ này không được sử dụng trong các bảng khác như khóa ngoài tôi muốn xóa nó. – ares

+3

Máy chủ SQL không hỗ trợ ON DELETE RESTRICT, nhưng bạn có thể sử dụng ON DELETE NO ACTION để có được hành vi mong muốn (một lỗi nếu bạn cố gắng xóa một hàng được sử dụng bởi một bảng khác dưới dạng FK). –

Trả lời

2

Bạn cần để tham gia tất cả các bảng khác. Như thế này:

select * 
from Parents 
where 
exists(select * from Children1 where ...) 
or exists(select * from Children2 where ...) 
or exists(select * from Children3 where ...) 

Nếu tất cả các cột FK của bạn được lập chỉ mục này sẽ cực kỳ hiệu quả. Bạn sẽ nhận được hợp nhất tham gia tốt đẹp.

8

Để biết cách sử dụng chung, bạn sẽ nhận được tất cả các bảng có khóa ngoại, và sau đó bạn có thể tạo vòng lặp để kiểm tra tất cả các bảng trong danh sách. Bằng cách này, bạn có thể thêm khóa ngoài và không cần thay đổi mã nào nữa ...

SELECT 
sys.sysobjects.name, 
sys.foreign_keys.* 
FROM 
sys.foreign_keys 
inner join sys.sysobjects on 
    sys.foreign_keys.parent_object_id = sys.sysobjects.id 
WHERE 
referenced_object_id = OBJECT_ID(N'[dbo].[TableName]') 
+1

Hoạt động như một sự quyến rũ! –

+2

Tuy nhiên, mã đơn giản hơn có thể là: 'select object_name (parent_object_id) * từ sys.foreign_keys trong đó referenced_object_id = object_id ('dbo.TableName')' –

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