Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Ràng buộc khóa ngoại MySQL, xóa theo tầng

Nếu quá trình xếp tầng của bạn xóa bỏ một sản phẩm vì nó là một thành viên của danh mục đã bị loại bỏ, thì bạn đã thiết lập khóa ngoại của mình không đúng cách. Với các bảng mẫu của bạn, bạn sẽ có thiết lập bảng sau:

CREATE TABLE categories (
    id int unsigned not null primary key,
    name VARCHAR(255) default null
)Engine=InnoDB;

CREATE TABLE products (
    id int unsigned not null primary key,
    name VARCHAR(255) default null
)Engine=InnoDB;

CREATE TABLE categories_products (
    category_id int unsigned not null,
    product_id int unsigned not null,
    PRIMARY KEY (category_id, product_id),
    KEY pkey (product_id),
    FOREIGN KEY (category_id) REFERENCES categories (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
)Engine=InnoDB;

Bằng cách này, bạn có thể xóa một sản phẩm HOẶC một danh mục và chỉ những bản ghi được liên kết trong danh mục_sản phẩm mới chết cùng. Dòng thác sẽ không di chuyển xa hơn đến cây và xóa bảng danh mục / sản phẩm mẹ.

ví dụ:

products: boots, mittens, hats, coats
categories: red, green, blue, white, black

prod/cats: red boots, green mittens, red coats, black hats

Nếu bạn xóa danh mục 'màu đỏ', thì chỉ mục nhập 'màu đỏ' trong bảng danh mục bị chết, cũng như hai mục nhập sản phẩm / mèo:'ủng đỏ' và 'áo khoác đỏ'.

Việc xóa sẽ không diễn ra xa hơn nữa và sẽ không loại bỏ các danh mục 'ủng' và 'áo khoác'.

bình luận theo dõi:

bạn vẫn đang hiểu sai cách hoạt động của tính năng xóa theo tầng. Chúng chỉ ảnh hưởng đến các bảng trong đó "dòng thác đang xóa" được xác định. Trong trường hợp này, tầng được đặt trong bảng "danh mục_sản phẩm". Nếu bạn xóa danh mục 'màu đỏ', các bản ghi duy nhất sẽ xóa theo tầng trong danh mục_sản phẩm là những bản ghi có category_id = red . Nó sẽ không chạm vào bất kỳ bản ghi nào trong đó 'category_id =blue' và nó sẽ không di chuyển trở đi đến bảng "sản phẩm", vì không có khóa ngoại nào được xác định trong bảng đó.

Đây là một ví dụ cụ thể hơn:

categories:     products:
+----+------+   +----+---------+
| id | name |   | id | name    |
+----+------+   +----+---------+
| 1  | red  |   | 1  | mittens |
| 2  | blue |   | 2  | boots   |
+---++------+   +----+---------+

products_categories:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1          | 1           | // red mittens
| 1          | 2           | // blue mittens
| 2          | 1           | // red boots
| 2          | 2           | // blue boots
+------------+-------------+

Giả sử bạn xóa danh mục số 2 (màu xanh lam):

DELETE FROM categories WHERE (id = 2);

DBMS sẽ xem xét tất cả các bảng có khóa ngoại trỏ đến bảng 'danh mục' và xóa các bản ghi có id khớp là 2. Vì chúng tôi chỉ xác định mối quan hệ khóa ngoại trong products_categories , bạn kết thúc với bảng này sau khi quá trình xóa hoàn tất:

+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1          | 1           | // red mittens
| 2          | 1           | // red boots
+------------+-------------+

Không có khóa ngoại nào được xác định trong các sản phẩm products bảng, do đó, thác sẽ không hoạt động ở đó, vì vậy bạn vẫn có ủng và găng tay được liệt kê. Không còn 'ủng xanh' và 'găng tay xanh' nữa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chia chuỗi mysql

  2. ĐẶT HÀNG MySQL BẰNG TRONG ()

  3. Sử dụng Cơ sở dữ liệu quan hệ MySQL trên Ubuntu 9.10 (Karmic)

  4. Cách cài đặt và cấu hình phpMyAdmin trên Debian 8

  5. Làm cách nào để phát hiện giao dịch đó đã được bắt đầu?