我正在尝试制作一本地址簿。并且让我的桌子像这样:
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
列的所有子行
答案 0 :(得分:0)
我认为你不应该让MySQL做那么多繁重的工作,特别是如果它是空的那么删除它。有没有具体的理由这样做,即如果该组是空的,该组是否可以再使用?如果你真的想要,你可以用mysql triggers实现这个目标。
至于防止删除一个组,该组只是由您在组上的联系人上的foriegn键完成的。但是我强烈建议您使用ID而不是键的名称。
您所说的内容似乎有冲突,但是:您想要阻止删除具有联系人的群组,但是您希望在删除群组时删除群组中的所有联系人?