SORU
26 Mayıs 2010, ÇARŞAMBA


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
26 Mayıs 2010, ÇARŞAMBA


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Howcast

    Howcast

    4 EKİM 2007
  • UKF Dubstep

    UKF Dubstep

    29 NİSAN 2009
  • Vagrant Records

    Vagrant Reco

    8 Mayıs 2006