2010-10-11 3 views
0

J'essaie de créer un carnet d'adresses. Et ont fait mes tables comme ceci:Aide avec ma structure de table

CREATE TABLE `list_`.`contacts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` tinyint(11) NOT NULL, 
    `group` varchar(128) NOT NULL, 
    `first_name` varchar(128) NOT NULL, 
    `last_name` varchar(128) NOT NULL, 
    `address` varchar(128) NOT NULL, 
    `city` varchar(128) NOT NULL, 
    `state` varchar(2) NOT NULL, 
    `zip` int(5) NOT NULL, 
    `phone_number` varchar(16) NOT NULL, 
    `cell_number` varchar(16) NOT NULL, 
    `work_number` varchar(16) NOT NULL, 
    `fax_number` varchar(16) NOT NULL, 
    `email` varchar(128) NOT NULL, 
    `company` varchar(55) NOT NULL, 
    `title` varchar(56) NOT NULL, 
    `notes` text NOT NULL, 
    `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`,`user_id`), 
    KEY `user_id` (`user_id`), 
    KEY `group` (`group`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; 


CREATE TABLE `list_`.`groups` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` tinyint(11) NOT NULL, 
    `position` int(8) unsigned NOT NULL DEFAULT '0', 
    `name` varchar(128) NOT NULL, 
    `date_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`,`user_id`), 
    KEY `user_id` (`user_id`), 
    KEY `name` (`name`) 
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 AUTO_INCREMENT=32 ; 

Ma logique est ici que j'ai tous les contacts de la table contacts, à partir de là que j'ai une colonne appelée group que j'utilise pour filtrer les contacts en groupes.

Puis j'ai une table appelée groups que je vais utiliser pour suivre quels groupes ont été créés par un utilisateur spécifique et remplir un de ces groupes afin qu'ils puissent déplacer les contacts.

Lorsqu'un groupe est supprimé, je renvoie une erreur sans la laisser être supprimée si le groupe contient des contacts. Je peux probablement interroger les contacts pour voir à quel groupe ils appartiennent et s'ils appartiennent au groupe étant supprimé alors je les déplacerai dans un groupe appelé Uncategorized ou quelque chose. Mais s'ils choisissent d'accepter et de supprimer TOUS les contacts d'un groupe, alors supprimez le groupe et toutes les lignes enfants appartenant à ce groupe.

J'ai des difficultés à créer mes clés Foreing dans la table contacts. Peu importe la combinaison d'index et de touches que j'essaie, je n'arrive toujours pas à le faire fonctionner.

-- 
-- Constraints for table `contacts` 
-- 
ALTER TABLE `list_`.`contacts` 
    ADD CONSTRAINT `contacts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`), 
    ADD CONSTRAINT `contacts_ibfk_2` FOREIGN KEY (`group`) REFERENCES `groups` (`name`) ON UPDATE CASCADE; 

-- 
-- Constraints for table `groups` 
-- 
ALTER TABLE `list_`.`groups` 
    ADD CONSTRAINT `group_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`); 

Aussi, quelqu'un peut-il m'aider avec le ON DELETE et ON UPDATE. Pour m'aider à comprendre comment je peux supprimer toutes les lignes enfant qui référencent la colonne name dans groups

Répondre

0

Je ne pense pas que MySQL devrait faire autant de gros travaux, en supprimant spécifiquement un groupe s'il est vide. Y a-t-il une raison spécifique de le faire, c'est-à-dire que le groupe ne peut plus être utilisé s'il est vide? Vous pourriez probablement réaliser ceci avec mysql triggers si vous le vouliez vraiment. Comme pour empêcher la suppression d'un groupe qui est simplement fait par la clé foriegn sur les contacts que vous avez déjà sur les groupes. Cependant, je recommande fortement que vous utilisiez des identifiants plutôt que des noms pour les clés. Cependant, ce que vous dites semble être en conflit: vous voulez empêcher la suppression d'un groupe qui a des contacts, mais vous voulez que tous les contacts d'un groupe soient supprimés lorsque le groupe est supprimé?

+0

oui, à votre dernière question. Altho mon problème est que quand j'exécute le code je reçois toujours des erreurs qui disent: Impossible d'ajouter ou de mettre à jour une ligne enfant: une contrainte de clé étrangère échoue ('list_'. , CONSTRAINT 'contacts_ibfk_2' FOREIGN KEY (' group') REFERENCES 'groups' (' nom') ON DELETE CASCADE) – Eli

+0

Non, je dis que les deux dernières déclarations sont en opposition. Comment pouvez-vous empêcher la suppression d'un groupe qui a des contacts mais également supprimer tous les contacts dans le groupe quand il est supprimé? Le groupe doit n'avoir aucun contact à supprimer en premier lieu. Quelle requête exécutez-vous lorsque vous obtenez cette erreur spécifique? –

+0

exactement ce que j'ai dans mon message original, j'ai d'autres tables déjà dans ma base de données comme user_id est une clé étrangère à users.id – Eli