2010-04-19 38 views
5

Tôi có một bảng danh mục, một trong các trường này đóng vai trò là khóa ngoại cho một bảng danh mục con. Một trường phục vụ như một phần của khóa chính cho mỗi bảng là id ngôn ngữ. Tôi cần phải cập nhật chúng trong cả hai bảng. Về cơ bản, bất cứ nơi nào ngôn ngữ id = x trong cả hai bảng, tôi cần phải đặt nó thành y.SQL cập nhật một bảng có khóa ngoài

Khi tôi cố gắng thực hiện cập nhật trên một trong hai bảng, tôi nhận được 'Câu lệnh UPDATE mâu thuẫn với ràng buộc REFERENCE ..' đề cập đến ràng buộc khóa ngoài.

Làm cách nào để cập nhật trường ngôn ngữ trên cả hai bảng này?

+0

Có vẻ như 'y' của bạn không tồn tại trong bảng được tham chiếu (khoá ngoại). Bạn cần phải thêm nó trước. – Oded

+1

Máy chủ SQL? MySQL? Oracle? Và bạn có FK tròn? – gbn

Trả lời

9

Nếu bạn đang sửa lỗi 1 lần, hãy thả ràng buộc, CẬP NHẬT và sau đó thêm ràng buộc trở lại.

Nếu bạn cần thực hiện việc này như một phần của ứng dụng, hãy chèn một hàng danh mục, cập nhật hàng danh mục phụ và sau đó xóa hàng danh mục gốc.

5

Bạn cần phải thả các ràng buộc, cập nhật các giá trị và sau đó thêm lại các ràng buộc.

+0

OP không nói nếu đây là một lần hoặc một phần của logic nghiệp vụ. Phương pháp này tốt cho chuyển đổi một lần, nhưng không tốt cho các giao dịch dựa trên ứng dụng. –

2

Bạn sẽ phải tắt các ràng buộc trước, thực hiện cập nhật và sau đó bật lại các ràng buộc.

Kiểm tra điều này article bằng cách OdeToCode thảo luận về điều này.

2

Bạn có thể thay đổi ràng buộc của mình thành ON UPDATE CASCADE.

+0

+1 đó là những gì tôi nghĩ quá ... trừ khi động cơ DB không hỗ trợ điều này – gbn

2

Tôi luôn lo lắng về việc vô hiệu hóa các ràng buộc và bạn thực sự không muốn làm điều đó nếu đây là một hoạt động phổ biến.

Một thay thế được cho là xấu xí là: - Tạo hàng trong bảng cha, dựa trên hàng cần cập nhật nhưng chứa giá trị khóa ngoài mới - Cập nhật tất cả các hàng con mà khóa ngoại chứa giá trị cũ giá trị mới. - Xóa hàng khóa chính hiện tại chưa sử dụng

Điều này là khó xử vì bất kỳ lý do rõ ràng nào và có thể không phù hợp với việc triển khai của bạn nhưng vẫn duy trì tính toàn vẹn tham chiếu trong cơ sở dữ liệu.

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