Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mencegah Pemadaman Bertingkat dalam Hubungan Ibu Bapa-Anak MySQL?

Bagaimana untuk Mencegah Pemadaman Bertingkat dalam Hubungan Ibu Bapa-Anak MySQL?

Barbara Streisand
Lepaskan: 2024-12-14 18:14:11
asal
901 orang telah melayarinya

How to Prevent Cascading Deletes in MySQL Parent-Child Relationships?

Hadkan Pemadaman Lata untuk Hubungan Jadual Ibu Bapa-Anak

Apabila menggunakan kunci asing untuk mengekalkan integriti data dalam MySQL, adalah penting untuk memahami kesannya pemadaman melata. Klausa "ON DELETE CASCADE" membenarkan anda memadamkan rekod anak secara automatik apabila rekod induk dipadamkan. Walau bagaimanapun, jika anda perlu menghalang pemadaman berlatarkan yang akan mengakibatkan rekod anak yatim piatu, anda mesti mengkonfigurasi kunci asing anda dengan teliti.

Contoh: Hubungan Kategori-Produk

Pertimbangkan jadual contoh berikut:

CREATE TABLE categories (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE categories_products (
    category_id INT,
    product_id INT,
    PRIMARY KEY (category_id, 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
);
Salin selepas log masuk

Jika anda memadamkan kategori, ia biasanya akan lata dan padamkan semua produk yang dikaitkan dengan kategori itu, tidak kira sama ada produk tersebut tergolong dalam kategori lain juga.

Penyediaan Kunci Asing yang Betul

Untuk mengelakkan lata yang tidak diingini ini tingkah laku, anda mesti mengubah suai definisi kunci asing pada jadual categories_products:

CREATE TABLE categories_products (
    category_id INT,
    product_id INT,
    PRIMARY KEY (category_id, product_id),
    FOREIGN KEY (category_id) REFERENCES categories(id)
       ON DELETE SET NULL
       ON UPDATE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
);
Salin selepas log masuk

Dengan menukar peraturan ON DELETE kepada SET NULL, anda mengarahkan MySQL untuk menetapkan lajur category_id dalam jadual categories_products kepada NULL apabila kategori dipadamkan. Ini akan mengalih keluar perkaitan antara kategori dan produk, tetapi ia tidak akan memadamkan produk itu sendiri.

Lata Terpilih

Pendekatan ini memastikan pemadaman kategori hanya akan lata dan padamkan produk yang dikaitkan secara eksklusif dengan kategori itu. Produk yang tergolong dalam berbilang kategori akan kekal tidak terjejas.

Sebagai contoh, pertimbangkan data berikut:

categories:     products:
+----+---------+   +----+--------+
| id | name     |   | id | name   |
+----+---------+   +----+--------+
| 1  | Apparel  |   | 1  | Shirt  |
| 2  | Electronics |   | 2  | Phone  |
+----+---------+   +----+--------+

categories_products:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1          | 1           | // Apparel - Shirt
| 1          | 2           | // Electronics - Shirt
| 2          | 2           | // Electronics - Phone
+------------+-------------+
Salin selepas log masuk

Jika anda memadamkan kategori Pakaian, ia hanya akan memadamkan entri Pakaian - Baju daripada jadual kategori_produk. Produk baju (id = 1) akan tetap wujud kerana ia turut dikaitkan dengan kategori Elektronik.

Atas ialah kandungan terperinci Bagaimana untuk Mencegah Pemadaman Bertingkat dalam Hubungan Ibu Bapa-Anak MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan