Làm thế nào để sử dụng RESTRICT cho Khóa ngoài trong mysql?


11

Trong cấu trúc cơ sở dữ liệu của

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Tôi hy vọng sẽ xóa cha mẹ khỏi Citybằng cách giữ nguyên giá trị tương ứng ở con bằng ba lệnh bằng nhau này

  FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
  FOREIGN KEY (city) REFERENCES City (name)

Nhưng khi sử dụng NO ACTIONHOẶC RESTRICThoặc bỏ qua ON DELETE. MySQL không cho phép tôi xóa khỏi cột cha với lỗi này:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
 ON DELETE RESTRICT

Tôi sai ở đâu Không phải trách nhiệm của SQL là NO ACTIONxóa cha mẹ và để lại đứa trẻ mồ côi?

Câu trả lời:


13

Theo Tài liệu MySQL về HẠN CHẾ XÓA

• RESTRICT: Từ chối thao tác xóa hoặc cập nhật cho bảng cha. Chỉ định RESTRICT (hoặc KHÔNG HÀNH ĐỘNG) giống như bỏ qua mệnh đề ON DELETE hoặc ON UPDATE.

Không có hành động

• KHÔNG HÀNH ĐỘNG: Một từ khóa từ SQL tiêu chuẩn. Trong MySQL, tương đương với RESTRICT. InnoDB 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à KHÔNG HÀNH ĐỘNG là 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 đó KHÔNG CÓ HÀNH ĐỘNG nào giống như GIỚI HẠN.

XÓA HẠN CHẾ bảo vệ cha mẹ khỏi bị xóa, không phải con cái.


5

Nếu bạn muốn xóa cha mẹ và rời khỏi con, thì có lẽ bạn muốn ON DELETE SET NULLtùy chọn:

SET NULL: 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. Cả hai mệnh đề ON DELETE SET NULL và ON UPDATE SET NULL đều được hỗ trợ.

Nếu bạn chỉ định một hành động SET NULL, hãy đảm bảo rằng bạn chưa khai báo các cột trong bảng con là KHÔNG NULL.

Có rất nhiều từ 'không' trong câu cuối cùng đó, vì vậy hãy chắc chắn rằng Parent_id có thể là NULL.

Xem thêm qestion liên quan này: Mục đích của SET NULL trong các ràng buộc Xóa / Cập nhật Khóa ngoài là gì?

Bằng cách xác định khóa ngoại, bạn đã bảo cơ sở dữ liệu không chấp nhận các mục trong bảng con không có giá trị tương ứng trong phần gốc.

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.