MySQL hiyerarşik verilerin silinmesini basamaklı uygulamak nasıl?

2 Cevap php

Ben kategorileri / alt kategorileri vardır bir proje üzerinde çalışıyorum. Bunun için veritabanı tablosu aşağıdaki yapıya sahip, benzersiz:

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) NOT NULL auto_increment,
  `publish` tinyint(1) NOT NULL default '0',
  `parent_id` int(11) NOT NULL default '0',
  `description` text NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Yani, durumda kategori parent_id sıfır, bir "taban" biridir, ve bir üst kategori varsa, bu ana id herds. Ne bilmek istiyorum bu: Ben o seçeneği, bir çağlayan gibi silme seçerken yukarıda ve bir kategori ile ilgili her şeyi silmek gerekiyor, ama ben sadece (yabancı anahtar) .. Bunu nasıl yaparsınız bu tablo var? (Sorguları büyük miktarda olmadan)

Şimdiden teşekkürler!

2 Cevap

  • Bunu yapmak için bir tetikleyici yazabilirsiniz.

    DELIMITER //
    CREATE TRIGGER CatDelete AFTER DELETE ON categories
    FOR EACH ROW BEGIN
      DELETE FROM categories WHERE parent_id = old.id;
    END//
    DELIMITER ;
    
  • Sen InnoDB için ALTER sizin MyISAM tabloları can, ve sonra ON DELETE CASCADE seçeneği ile yabancı anahtar kısıtlamaları tanımlamak.

    ALTER TABLE categories ENGINE=InnoDB;
    ALTER TABLE categories ADD CONSTRAINT 
      FOREIGN KEY (parent_id) REFERENCES categories (id) ON DELETE CASCADE;
    


Yorumlarınız Re, ben kontrol ederdim ilk şey, bazı yetim kategoriler varsa, o parent_id, bir var olmayan satıra işaret ile olmasıdır. Bu kısıtlama oluşturmak engel olur.

SELECT c1.*
FROM categories c1
LEFT OUTER JOIN categories c2
  ON (c1.parent_id = c2.id)
WHERE c2.id IS NULL;

Sadece benim 0,02 $ - Bu kadar önemsiz değil çözüm kaskad silme işlemek için MVC gerektirir gerekir.