外键指的是同一张表Mysql中的主键

Posted

技术标签:

【中文标题】外键指的是同一张表Mysql中的主键【英文标题】:Foreign key referring to primary key in the same table Mysql 【发布时间】:2018-11-20 14:03:51 【问题描述】:
# Sql to create userdetails table:
CREATE TABLE `userdetails` (
 `user_details_id` int(3) unsigned NOT NULL AUTO_INCREMENT,
 `user_group_id` int(1) unsigned NOT NULL,
 `name` varchar(50) NOT NULL,
 `email_id` varchar(50),
 `password` varchar(50) NOT NULL,
 `mobile_no` varchar(10) NOT NULL,
 `company_id` int(3) unsigned,
 `vehicle_id` varchar(10),
 `date_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `date_updated` datetime NOT NULL,
 `created_by` int(3) unsigned NOT NULL,
 `status` enum('0','1') NOT NULL DEFAULT '0',
 PRIMARY KEY (`user_details_id`),
 UNIQUE KEY `email_id` (`email_id`),
 FOREIGN KEY (`user_group_id`) REFERENCES `usergroups` (`user_group_id`),
 FOREIGN KEY (`company_id`) REFERENCES `companies` (`company_id`),
 FOREIGN KEY (`created_by`) REFERENCES `userdetails` (`user_details_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

关注 'user_details_id' 和 'created_by' 列,当 created_by 不引用现有的 user_details_id 时会出现冲突。

意思是,如果我使用所需的详细信息创建自己的个人资料,我的 user_details_id 尚未生成,因此我不知道在 created_by 字段中输入什么值(理想情况下应该包含我的 user_details_id)。

如果有人能指导我如何处理此类冲突,以及是否有办法在 user_details_id 字段生成之前确定它的值,我将不胜感激。

谢谢。

【问题讨论】:

created_by 允许为空 @MKhalidJunaid 澄清一下,我希望 created_by 字段不为空,因此保留相应的 user_details_id 的值。 @MKhalidJunaid 我最终允许 created_by 为 null,因为这似乎是我的方法最简单的解决方案。 【参考方案1】:

您无法通过设置服务器变量foreign_key_checks临时禁用外键检查来处理它

SET FOREIGN_KEY_CHECKS=0;

INSERT INTO cities userdetails(....);

SET FOREIGN_KEY_CHECKS = 1;

【讨论】:

澄清一下,我希望 created_by 字段不为空,因此保留相应的 user_details_id 的值。这可能吗? 是的,您将能够推迟检查约束操作【参考方案2】:
# Sql to create userdetails table:
CREATE TABLE `userdetails` (
 `user_details_id` int(3) unsigned NOT NULL AUTO_INCREMENT,
 `user_group_id` int(1) unsigned NOT NULL,
 `name` varchar(50) NOT NULL,
 `email_id` varchar(50),
 `password` varchar(50) NOT NULL,
 `mobile_no` varchar(10) NOT NULL,
 `company_id` int(3) unsigned,
 `vehicle_id` varchar(10),
 `date_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `date_updated` datetime NOT NULL,
 `created_by` int(3) unsigned,
 `status` enum('0','1') NOT NULL DEFAULT '0',
 PRIMARY KEY (`user_details_id`),
 UNIQUE KEY `email_id` (`email_id`),
 FOREIGN KEY (`user_group_id`) REFERENCES `usergroups` (`user_group_id`),
 FOREIGN KEY (`company_id`) REFERENCES `companies` (`company_id`),
 FOREIGN KEY (`created_by`) REFERENCES `userdetails` (`user_details_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

允许 created_by 接受 NULL 值似乎是解决此问题的快速方法,因为这可能意味着用户是自行创建的。

【讨论】:

以上是关于外键指的是同一张表Mysql中的主键的主要内容,如果未能解决你的问题,请参考以下文章

数据库—超键候选键主键外键

谈谈mysql的主键和外键

主键和外键

数据库:外键重复

3.啥是键、候选键、主键和外键?

初学者必备:MySQL的主键,外键与唯一约束设置(点赞!!!)