【问题标题】:Help with my table structure帮助我的表结构
【发布时间】:2010-10-11 01:47:23
【问题描述】:

我正在尝试制作通讯录。并把我的桌子做成这样:

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。为了帮助我弄清楚如何删除引用groups 中的name 列的所有子行

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我认为你不应该让 MySQL 做这么多繁重的工作,特别是如果它是空的,就删除一个组。是否有任何具体原因要这样做,即如果该组为空,则不能再使用该组?如果你真的想的话,你可以通过mysql triggers 来实现这一点。

    至于防止删除组,只需通过您在组中已有的联系人上的外键即可完成。不过我强烈建议您使用 id 而不是键名。

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

    【讨论】:

    • 是的,你的最后一个问题。尽管如此,我的问题是,当我运行代码时,我不断收到错误消息:无法添加或更新子行:外键约束失败(list_., CONSTRAINT contacts_ibfk_2 外键 (group) 引用 groups (name) 删除级联)
    • 不,我是说最后两个陈述是对立的。如何防止删除包含联系人的组,但在删除组时删除该组中的所有联系人?该组必须首先没有要删除的联系人。当您遇到特定错误时,您正在运行什么查询?
    • 正是我在原始帖子中的内容,我的数据库中已经有其他表,因为 user_id 是 users.id 的外键
    • 啊,我明白了; contacts.group 中是否有任何不在组中的条目?
    • 好吧,我所做的就是尝试将 group.contact 引用到 name.group。所以无论该组的名称是什么,它都会显示为......哦,愚蠢的我,我只是回答了我自己的问题,输入了这个;0
    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2021-12-03
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多