2009-10-16 11 views
0

Je commence à expérimenter avec InnoDB dans les applications web. J'ai configuré certaines tables avec une clé étrangère, mais elles ne se comportent pas comme prévu. Voici ma table créer des instructions:MySQL InnoDB CASCADE?

CREATE TABLE sections ( 
    section_id INT NOT NULL AUTO_INCREMENT, 
    title  VARCHAR(30), 
    created_at int(10) NOT NULL, 
    updated_at int(10) NOT NULL, 

    PRIMARY KEY(section_id) 
) ENGINE=InnoDB; 

CREATE TABLE pages ( 
    page_id  INT NOT NULL AUTO_INCREMENT, 
    section_idfk INT NOT NULL, 

    PRIMARY KEY(page_id), 
    FOREIGN KEY(section_idfk) REFERENCES sections(section_id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=InnoDB; 

Les tables créent ok et je peux les remplir avec des données, cependant, je me attendais à tout changement que j'ai fait à la table des sections pour avoir un effet sur les lignes correspondantes dans la Table des pages. J'ai essayé de changer l'identifiant d'une section et aussi de supprimer une section entièrement. Dans les deux cas, la table Pages n'a pas été affectée. Est-ce que quelqu'un peut voir où je vais mal?

Un conseil apprécié.
Merci.

+0

Vous devez faire quelque chose de mal, cela fonctionne correctement. –

Répondre

2

Je suis rapidement mis ensemble deux tables similaires dans le MySQL Query Browser avec les définitions suivantes:

DROP TABLE IF EXISTS `test`.`sections`; 
CREATE TABLE `test`.`sections` (
    `section_id` int(10) unsigned NOT NULL auto_increment, 
    `title` varchar(30) NOT NULL, 
    `created_at` int(10) unsigned NOT NULL, 
    `updated_at` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`section_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 

DROP TABLE IF EXISTS `test`.`pages`; 
CREATE TABLE `test`.`pages` (
    `page_id` int(10) unsigned NOT NULL auto_increment, 
    `section_idfk` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`page_id`), 
    KEY `section_idfk` (`section_idfk`), 
    CONSTRAINT `section_idfk` FOREIGN KEY (`section_idfk`) REFERENCES `sections` (`section_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 

Pas exactement les mêmes que ceux que vous posté, mais assez près.

Je l'insère dans les sections une rangée. J'ajoute une ligne avec un identificateur de section correspondant dans la table des pages. Ensuite, je fais une section DELETE FROM; et il supprime également des pages.

Fonctionne très bien. Edit - Je suis entré dans votre création et cela fonctionne bien aussi.

+0

Merci. Je suis en train d'essayer de le faire à partir d'un script PHP, donc je suppose qu'il y a une sorte d'erreur dans le SQL qu'il produit. Cela semble étrange que cela crée quand même des tables du tout. J'ai répercuté la sortie et elle est identique à celle ci-dessus autant que je peux voir. – Dan

Questions connexes