帮助我的表结构

时间:2010-10-11 01:47:23

标签: mysql

我正在尝试制作一本地址簿。并且让我的桌子像这样:

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表格中创建外键时遇到问题。无论我的索引和键的组合如何,我仍然无法使其工作。

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

此外,有人可以帮助我使用ON DELETE和ON UPDATE。为了帮助我弄清楚如何删除引用name

groups列的所有子行

1 个答案:

答案 0 :(得分:0)

我认为你不应该让MySQL做那么多繁重的工作,特别是如果它是空的那么删除它。有没有具体的理由这样做,即如果该组是空的,该组是否可以再使用?如果你真的想要,你可以用mysql triggers实现这个目标。

至于防止删除一个组,该组只是由您在组上的联系人上的foriegn键完成的。但是我强烈建议您使用ID而不是键的名称。

您所说的内容似乎有冲突,但是:您想要阻止删除具有联系人的群组,但是您希望在删除群组时删除群组中的所有联系人?