添加外键会产生错误“#1215 - 无法添加外键约束”

时间:2018-03-21 04:12:14

标签: mysql

  CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `first_name` varchar(50) NOT NULL,
  `last_name` varchar(50) NOT NULL,
  `email` varchar(150) NOT NULL,
  `is_email_verify` int(11) DEFAULT '0',
  `phone_no` varchar(15) NOT NULL,
  `password` varchar(255) NOT NULL,
  `status` varchar(10) NOT NULL,
  `role` varchar(50) NOT NULL DEFAULT 'employee',
  `photo` varchar(150) NOT NULL,
  `group_id` int(11) DEFAULT '0',
  `shift_id` int(11) NOT NULL DEFAULT '0',
  `shift_date` date NOT NULL,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  `first_off` varchar(15) NOT NULL,
  `second_off` varchar(15) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `project_maps` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project_id` int(11) UNSIGNED NOT NULL,
  `user_id` int(11) UNSIGNED DEFAULT NULL,
  `group_id` int(11) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_project_id` (`project_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
COMMIT;

我正在尝试使用

将project_map.user_id映射到用户表..
ALTER TABLE users ADD CONSTRAINT fk_project_users FOREIGN KEY (id) REFERENCES project_maps(user_id);

产生错误“#1215 - 无法添加外键约束”可以解释为什么?

2 个答案:

答案 0 :(得分:0)

您需要将外键约束添加到project_maps,而不是users

ALTER TABLE project_maps
ADD CONSTRAINT fk_project_users
FOREIGN KEY (user_id) REFERENCES users (id);

但除此之外,两个表中的用户ID列类型不同。在users表中,您将其声明为unsigned int:

`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT

project_maps表中,您使用不同的定义:

`user_id` int(11) NOT NULL AUTO_INCREMENT

在两个表中使用相同的定义,您应该能够添加约束:

int(11) NOT NULL

FYI整数默认为在MySQL中签名,除非你明确地将它们取消签名。

答案 1 :(得分:0)

您正在尝试从 project_maps(user_id)定义外键,

所以这就是问题,

您不能将外键引用分配给非键列(user_id),

如果要创建外键列,则为project_maps表中的project_id创建一个user_id键;

如下

CREATE TABLE IF NOT EXISTS `project_maps` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `project_id` int(11) UNSIGNED NOT NULL,
  `user_id` int(11) UNSIGNED DEFAULT NULL,
  `group_id` int(11) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_project_id` (`project_id`),
  KEY `fk_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

然后您的alter query将按预期工作

ALTER TABLE users ADD CONSTRAINT fk_project_users FOREIGN KEY (id) REFERENCES project_maps(user_id);