2011-09-22 33 views
17

Tôi có hai bảng, một 'người dùng' và một 'đơn đặt hàng', trong đó bảng thứ tự có một tham chiếu khóa ngoài tới bảng id người dùng. (. Tôi đang sử dụng địa chỉ email như sử dụng id trong trường hợp này)MySql Phím ngoài: ON DELETE NO ACTION behavour - cách để lại thông tin trong trường tham chiếu?

Những gì tôi muốn thực hiện điều này là:

  1. Nếu id bảng người dùng được cập nhật (= chỉ email này đã được thay đổi), đây sẽ phản ánh trong trường user_id của bảng thứ tự được tham chiếu. (Điều này hoạt động tốt bằng cách sử dụng chỉ thị ON UPDATE CASCADE - không có vấn đề ở đây!)

  2. Nếu người dùng bị xóa khỏi bảng người dùng, thứ tự sẽ vẫn giữ, giữ người dùng tham chiếu.

Tôi đang gặp vấn đề với mục tiêu thứ hai:

Nếu tôi sử dụng ON DELETE CASCADE trên trường id người dùng tham chiếu, hàng trật tự là tất nhiên bị xóa.

Nếu tôi sử dụng BẬT XÓA KHÔNG CÓ HÀNH ĐỘNG, tôi gặp lỗi khi cố gắng xóa người dùng. (# 1451 - Không thể xóa hoặc cập nhật hàng gốc: không có ràng buộc khóa ngoài)

Nếu tôi sử dụng ON DELETE SET NULL, tôi có thể xóa hàng người dùng, nhưng thông tin được tham chiếu được đặt thành null vì vậy tôi không thể theo dõi những người đã đặt hàng đó ...

Có cách nào để cho phép xóa người dùng khỏi bảng người dùng trong khi vẫn giữ thông tin user_id được tham chiếu trong bảng đơn đặt hàng không?

Trả lời

20

Hai lựa chọn:

  • Đừng thực sự xóa người sử dụng, chỉ cần đánh dấu chúng là xóa bằng cách thiết lập một lĩnh vực deleted.

hay:

  • Tháo ràng buộc khoá ngoại.

Tôi muốn giới thiệu tùy chọn đầu tiên. Việc chọn tùy chọn thứ hai có thể dẫn đến sự thiếu nhất quán về dữ liệu. Bên cạnh đó, chỉ cần có giá trị của khóa mà không có các dữ liệu tương ứng trong bảng khác sẽ không giúp bạn nhiều anyway.

+0

Cảm ơn bạn, Mark! Vì vậy, điều đó có nghĩa rằng nó không thể đạt được những gì tôi yêu cầu trong defintions nước ngoài tinh khiết ..? – Cambiata

+2

@Cambiata: Đúng vậy, không thể "trong các định nghĩa khóa ngoài thuần túy". "Khóa ngoại" * có nghĩa là * giá trị tồn tại trong một bảng khác. Nếu bạn thực sự xóa hàng được tham chiếu từ bảng khác, bạn phải loại bỏ giá trị khóa ngoài bằng a) xóa toàn bộ hàng (ON DELETE CASCADE), hoặc b) đặt giá trị FK thành NULL (ON DELETE SET NULL) . –

+3

Tôi hiểu. Tôi đã hy vọng rằng không có hành động alternatvie có nghĩa là, cũng ... không có hành động. Trong ý nghĩa là giá trị hiện tại sẽ không bị ảnh hưởng, hoạt động như một giá trị không phải là fk bình thường. Rõ ràng là không! Cảm ơn, Mark! – Cambiata

0

Thực tế có một giải pháp thay thế khác - thay thế khóa địa chỉ email của bảng của người dùng bằng tự động INT.

Sau đó, bạn chỉ có thể sao chép thuộc tính người dùng (ugh, không chuẩn hóa) vào thứ tự (tôi đoán bạn có thể biện minh cho nó là 'địa chỉ email của người dùng đặt hàng tại thời điểm đặt hàng').

Sau đó, ON DELETE SET NULL có thể đặt lại khóa ngoại INT nhưng không phải thuộc tính được sao chép (địa chỉ email).

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