2010-10-11 66 views
0

我正在尝试创建通讯录。并取得了我的表是这样的:帮助我的表结构

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 ; 

我在这里的逻辑是,我在contacts表中的所有联系人,从那里我有一个叫group,我用它来筛选联系人到组列。

然后我有一张名为groups的表格,我将使用该表格来跟踪由特定用户创建的组,并填写这些组以便他们可以移动联系人。

当组被删除,我会扔回去不会再让如果组包含接触它被删除的错误。我大概可以查询联系人以查看他们属于哪个组,并且如果他们属于被删除的组,那么我会将他们移动到一个名为Uncategorized或其他组的组中。

但如果他们选择接受和删除组内的所有联系人,然后继续前进,删除组和属于该组的所有子行。

我无法在contacts表格制作我Foreing键。无论索引和键的组合如何,我仍然无法使其工作。

-- 
-- 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`); 

此外,有人可以帮我删除时和更新。为了帮我找出我如何可以删除所有的子行,在groups

回答

0

引用name专栏中,我不认为你应该拥有的MySQL做这么多繁重,特别是删除一个组,如果它是空的。是否有任何特定的理由来做到这一点,即如果该组是空的,组可以不再使用?如果你真的想要,你可以用mysql triggers来实现。

作为防止被简单地由foriegn键上,你已经在组联系人进行一组删除。不过,我强烈建议您使用ID而不是名称作为密钥。

你所说的似乎有冲突,但是:要防止有接触一组删除,但你想有一个组中的所有联系人当组被删除,被删除?

+0

是的,对你最后一个问题。虽然我的问题是,当我运行的代码时,我不断收到错误,说:无法添加或更新子行:外键约束失败('list_'。,CONSTRAINT 'contacts_ibfk_2' FOREIGN KEY('group')REFERENCES'groups'('name')ON DELETE CASCADE) – Eli 2010-10-11 03:18:20

+0

不,我是说最后两条语句是反对的。您如何防止删除拥有联系人的群组,并删除群组中的所有联系人?该组必须首先没有联系人被删除。当你得到那个特定的错误时,你运行什么查询? – 2010-10-11 03:20:24

+0

正是我在我原来的职位,我确实有其他表已经在我的分贝因为user_id是用户的外键.id – Eli 2010-10-11 03:25:19