Sự khác biệt giữa On Xóa Cascade & On Update Cascade trong mysql


45

Tôi có hai bảng trong MySQL database- parent, child. Tôi đang cố gắng thêm các tham chiếu khóa ngoại vào bảng con của mình dựa trên bảng cha. Có sự khác biệt đáng kể nào giữa ON UPDATE CASCADEON DELETE CASCADE

Bảng phụ huynh của tôi

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

Câu hỏi của tôi là: sự khác biệt giữa các truy vấn sql sau đây là gì.

  1. ON DELETE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON DELETE CASCADE
    ) ENGINE=INNODB;
    
  2. ON UPDATE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON UPDATE CASCADE
    ) ENGINE=INNODB;
    
  3. ON UPDATE CASCADE ON DELETE CASCADE

    CREATE TABLE child (
            id INT, 
            parent_id INT,
            INDEX par_ind (parent_id),
            FOREIGN KEY (parent_id) 
                REFERENCES parent(id)
                ON UPDATE CASCADE ON DELETE CASCADE
        ) ENGINE=INNODB;
    

Có bất kỳ lỗi trong các truy vấn? Những truy vấn này (1,2 & 3) nghĩa là gì ?? Họ có giống nhau không ???


1
ps <nitpick> cho tính đầy đủ, những gì bạn đang nói ở trên là các câu lệnh DDL (Ngôn ngữ định nghĩa dữ liệu) và không phải là truy vấn. Một truy vấn thường được coi là DML (Ngôn ngữ thao tác dữ liệu CHỌN, CHERTN, CẬP NHẬT, XÓA) </ nitpick>
Vérace

Một ps nữa cho đầy đủ, tôi tự hỏi mặc định là gì. Vì vậy, tôi đã tạo ra một đứa trẻ không có cập nhật hoặc xóa. Điều xảy ra sau đó là bạn không thể cập nhật cũng như xóa cha mẹ có con phụ thuộc. Điều đó có ý nghĩa hoàn hảo, tuy nhiên MySQL không phải lúc nào cũng là một mô hình của đặc điểm cụ thể đó :-)
Vérace

Câu trả lời:


64

Một chủ đề rất tốt về chủ đề này là được tìm thấy ở đây và cũng ở đây . Hướng dẫn dứt khoát cho MySQL, tất nhiên, là tài liệu, được tìm thấy ở đây .

Trong tiêu chuẩn SQL 2003 có 5 hành động tham chiếu khác nhau:

  1. TRƯỜNG HỢP
  2. GIỚI HẠN
  3. KHÔNG CÓ HÀNH ĐỘNG
  4. THIẾT LẬP
  5. THIẾT BỊ DEFAULT

Để trả lời câu hỏi:

  1. TRƯỜNG HỢP

    • ON DELETE CASCADEcó nghĩa là nếu bản ghi cha bị xóa, bất kỳ bản ghi con nào cũng bị xóa. Đây không phải là một ý tưởng tốt trong quan điểm của tôi. Bạn nên theo dõi tất cả dữ liệu đã có trong cơ sở dữ liệu, mặc dù điều này có thể được thực hiện bằng TRIGGERs. (Tuy nhiên, xem cảnh báo trong các ý kiến ​​dưới đây).

    • ON UPDATE CASCADEcó nghĩa là nếu khóa chính được thay đổi, giá trị con cũng sẽ thay đổi để phản ánh điều đó. Một lần nữa theo ý kiến ​​của tôi, không phải là một ý tưởng tuyệt vời. Nếu bạn đang thay đổi PRIMARY KEYbất kỳ sự đều đặn nào (hoặc thậm chí là tất cả!), Thì có gì đó không ổn với thiết kế của bạn. Một lần nữa, xem ý kiến.

    • ON UPDATE CASCADE ON DELETE CASCADEcó nghĩa là nếu bạn UPDATE HOẶC DELETE cha mẹ, sự thay đổi được xếp tầng cho đứa trẻ. Điều này tương đương ANDvới kết quả của hai tuyên bố đầu tiên.

  2. GIỚI HẠN

    • RESTRICTcó nghĩa là bất kỳ nỗ lực nào để xóa và / hoặc cập nhật cha mẹ sẽ không đưa ra lỗi. Đây là hành vi mặc định trong trường hợp hành động tham chiếu không được chỉ định rõ ràng.

      Đối với một ON DELETEhoặc ON UPDATEkhông được chỉ định, hành động mặc định luôn luôn là RESTRICT`.

  3. KHÔNG CÓ HÀNH ĐỘNG

    • NO ACTION: Từ hướng dẫn . Một từ khóa từ SQL tiêu chuẩn. Trong MySQL, tương đương với RESTRICT. Máy chủ MySQL từ chối thao tác xóa hoặc cập nhật cho bảng cha nếu có giá trị khóa ngoài liên quan trong bảng được tham chiếu. Một số hệ thống cơ sở dữ liệu đã kiểm tra hoãn lại và NO ACTIONlà kiểm tra hoãn lại. Trong MySQL, các ràng buộc khóa ngoại được kiểm tra ngay lập tức, do đó, NO ACTIONgiống như RESTRICT.
  4. THIẾT LẬP

    • SET NULL- một lần nữa từ hướng dẫn. Xóa hoặc cập nhật hàng từ bảng cha và đặt cột hoặc cột khóa ngoại trong bảng con thành NULL. Đây không phải là ý tưởng hay nhất IMHO, chủ yếu vì không có cách "du hành thời gian" - tức là nhìn lại các bảng con và liên kết các bản ghi với NULLs với bản ghi cha có liên quan - CASCADEhoặc sử dụng TRIGGERs để điền vào bảng ghi nhật ký để theo dõi thay đổi (nhưng, xem ý kiến).
  5. THIẾT BỊ DEFAULT

    • SET DEFAULT. Một phần khác (có khả năng rất hữu ích) của tiêu chuẩn SQL mà MySQL đã không thực hiện! Cho phép nhà phát triển chỉ định một giá trị để đặt (các) cột khóa ngoài vào CẬP NHẬT hoặc XÓA. InnoDB và NDB sẽ từ chối các định nghĩa bảng với một SET DEFAULTmệnh đề.

Như đã đề cập ở trên, bạn nên dành thời gian xem tài liệu ở đây .


8
Tôi thích câu trả lời hoàn chỉnh của bạn tuy nhiên tôi không đồng ý với tuyên bố này. "Bạn nên theo dõi tất cả dữ liệu đã có trong cơ sở dữ liệu" - điều này thực sự phụ thuộc vào thiết kế và mục đích của cơ sở dữ liệu. Ví dụ: Định nghĩa công thức (Tôi không nói về thực phẩm - giống như cấu hình hệ thống) khi định nghĩa công thức bị xóa, sẽ không có ý nghĩa gì trong việc giữ các con liên quan của công thức đó - chỉ làm hỏng db mà không có lý do. Ngoài ra các bảng làm việc cho các hệ thống máy - Tôi không cần dữ liệu nữa; xử lý và thoát khỏi nó. Khác hơn là câu trả lời của bạn là tuyệt vời.
StixO

2
tương tự như @StixO Tôi thích câu trả lời này, nhưng tôi không đồng ý với việc thay đổi khóa chính. Chắc chắn có những thiết kế mà đây sẽ là một ý tưởng tồi nhưng khi bạn vào một cơ sở dữ liệu phân tán, có thể rất mong muốn rằng các khóa chính được tự do gán lại mà không làm mất bản sắc của một bản ghi.
Garet Claborn

"Đây không phải là một ý tưởng tốt theo quan điểm của tôi. Bạn nên theo dõi tất cả dữ liệu đã từng có trong cơ sở dữ liệu." - Không chắc tôi hiểu quan điểm của bạn. Nếu bạn đang xếp tầng 'khi xóa', thì bạn đã quyết định rằng bạn cần xóa một cái gì đó. Nếu bạn quyết định không bao giờ xóa bất cứ điều gì, sẽ không có gì xếp tầng. Tuy nhiên, lợi ích của việc có nó là trong ứng dụng của bạn, bạn có thể chắc chắn rằng khi bạn tìm bản ghi có ID nước ngoài, bạn sẽ biết rằng nó sẽ ở đó và sẽ không có bất kỳ hàng mồ côi nào tràn đầy cơ sở dữ liệu của bạn nếu bạn quyết định xóa một cái gì đó
Jeff Ryan

Logic ở đây khá lỗi ở những nơi, và thậm chí còn hơn thế trong thế giới GDPR mới của chúng tôi. Tôi đồng ý với quan điểm rằng nếu các khóa chính đang thay đổi, thì đó có thể là dấu hiệu của một cái gì đó sai.
Chuck Le Mông

Nếu bạn đang thay đổi các phím CHÍNH HÃNG với bất kỳ sự đều đặn nào (hoặc thậm chí là tất cả!), Thì có gì đó không ổn với thiết kế của bạn. Bạn có nghĩa là CẬP NHẬT CASCADE thay đổi giá trị của khóa hoặc tên của khóa?
Billal Begueradj

8

Hai cái này là các hành động được thực hiện, tương ứng, khi bản ghi được tham chiếu trên bảng cha thay đổi id của nó và khi nó bị xóa.

Nếu bạn thực thi:

UPDATE parent SET id = -1 WHERE id = 1;

Và có ít nhất một bản ghi trên childvới parent_id = 1, 1) sẽ thất bại; trong trường hợp 2) và 3), tất cả các bản ghi có Parent_id = 1 được cập nhật thành Parent_id = -1.

Nếu bạn thực thi:

DELETE FROM parent WHERE id = 1;

Và có ít nhất một bản ghi trên childvới parent_id = 1, 2) sẽ thất bại; trong trường hợp 1) và 3), tất cả các hồ sơ với parent_id = 1sẽ bị xóa.

3) là đúng về mặt cú pháp.

Tài liệu đầy đủ có thể được tìm thấy trên hướng dẫn .


6

Tôi không có đủ danh tiếng để bình luận về các câu trả lời trước đó. Vì vậy, tôi nghĩ rằng tôi sẽ giải thích một chút.

1) TRÊN XÓA CASCADE có nghĩa là nếu hồ sơ gốc bị xóa, thì bất kỳ hồ sơ con tham chiếu nào cũng bị xóa. TRÊN CẬP NHẬT mặc định thành RESTRICT, có nghĩa là CẬP NHẬT trên hồ sơ gốc sẽ thất bại.

2) BẬT hành động XÓA mặc định thành RESTRICT, điều đó có nghĩa là XÓA trên hồ sơ gốc sẽ thất bại. TRÊN CẬP NHẬT CASCADE sẽ cập nhật tất cả các hồ sơ con tham chiếu khi hồ sơ gốc được cập nhật.

3) Xem các hành động CASCADE trong 1) và 2) ở trên.

Khi sử dụng ID bản ghi gốc làm khóa ngoại (trong bảng con) - kinh nghiệm cho biết a) nếu ID là số thứ tự được tạo tự động, thì KHÔNG sử dụng chúng làm khóa ngoại. Sử dụng một số khóa cha duy nhất khác thay thế. b) nếu ID là GUID, thì bạn có thể sử dụng chúng làm khóa ngoại. Bạn sẽ thấy sự khôn ngoan trong đề xuất này khi bạn xuất và nhập các bản ghi hoặc sao chép hồ sơ sang cơ sở dữ liệu khác. Quá phức tạp để xử lý các số thứ tự được tạo tự động trong quá trình di chuyển dữ liệu khi chúng được gọi là khóa ngoại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.