MySQL yabancı anahtar kısıtlamaları, ardarda sil
Yabancı anahtarlar bütünlüğünü korumak için kullanın ve yetimler (zaten bunu kullanın) önlemek istiyorum.
Nasıl CASCADE ON DELETE SQL bir ifade yapabilirim?
Eğer bir kategori ne de diğer kategoriler ile ilgili ürünler silmek olmaz emin olabilirim. silersem
Pivot tablo "categories_products" diğer iki tablo arasında çok-çok ilişki oluşturur.
categories
- id (INT)
- name (VARCHAR 255)
products
- id
- name
- price
categories_products
- categories_id
- products_id
CEVAP
Eğer senin basamaklı siler öldürüldüğü bir kategori üyesi olduğu için bir ürün nuke, sonra yabancı anahtarları yanlış kurdum. Örnek tabloları dikkate alındığında, Aşağıdaki tablo kurulumu gerekir
CREATE TABLE categories (
id int unsigned not null primary key,
name VARCHAR(255) default null
);
CREATE TABLE products (
id int unsigned not null primary key,
name VARCHAR(255) default null
);
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
);
Bu şekilde, bir ürün YA da kategori silebilir ve categories_products sadece ilişkili kayıtlarıyla birlikte ölecek. Cascade uzak ağaca seyahat ve ana ürün/kategori tabloyu silmek olmaz.
örneğin
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
Eğer delete 'kırmızı' kategorisi, yalnızca 'kırmızı' giriş kategoriler tablo ölür, yanı sıra iki giriş prod/kediler: 'kırmızı çizme' ve 'kırmızı ceket'.
Bu silmez Çağlayan daha uzağa ve çıkar olmaz 'boots' ve 'palto' kategoriler.
yorum takip:
hala basamaklı siler nasıl yanlış anlıyorsunuz. Onlar sadece "on delete cascade" tanımlanır. tabloları etkileyen Bu durumda, cascade "" tablo. categories_products yer almaktadır Eğer 'kırmızı' kategorisi, categories_products sil kademeli kayıtları category_id = red
O. silerseniz '=Category_id mavi' ve "yabancı anahtar tablosunda tanımlanan yok. çünkü" masa ürünleri için ileriye yolculuk olmazdı herhangi bir kayıt dokunmatik olmayacak
Burada daha somut bir örnek:
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
------------ -------------
Hadi category #2 (mavi) silin ki:
DELETE FROM categories WHERE (id = 2);
VERİTABANI yabancı anahtar işaret var 'kategoriler' eşleşen kimliği 2 bulunduğu tablo ve kayıtları silin. tüm tablolar bakar Biz sadece products_categories
, yabancı anahtar ilişkisi tanımlanmış beri, seni silmek tamamlandıktan sonra bu tablo ile sonuna kadar:
------------ -------------
| product_id | category_id |
------------ -------------
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
------------ -------------
Yabancı anahtar products
tabloda tanımlı yok, cascade orada çalışmaz, hala botları ve eldivenleri listede var. Sadece 'mavi bot' ve 'mavi eldiven' artık. yok yok
MySQL Yabancı anahtar temelleri?...
Kuvvet mysql atlayarak yabancı anahtar...
Tanıtımı YABANCI ANAHTAR kısıtlaması d...
Yabancı anahtar NULL izin MySQL?...
SİL GÜNCELLEME ve yabancı anahtar kısı...