我无法添加 MySQL 外键约束

时间:2021-03-18 06:47:47

标签: mysql database

我有三个表 user、department 和 department_hod 用户有一个department_id,它是department 的主键,department 也有hod,它是用户的主键。 但是在department_hod 表中添加username 的外键约束时出现错误,

请帮忙

--
-- Create a user table
--

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` char(80) NOT NULL,
  `emp_id` int(11) NOT NULL,
  `designation` varchar(50) NOT NULL,
  `department_id` int(11) NOT NULL,
  `status` varchar(2) NOT NULL DEFAULT 'A',
  `email_id` varchar(50) NOT NULL,
  `account_status` varchar(2) NOT NULL DEFAULT 'U',
  `validity_date` TIMESTAMP,
  `deactivation_date` TIMESTAMP ,
  `deactivated_by` varchar(50),
  `deactivation_remarks` varchar(1000),
  `creation_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updation_date` TIMESTAMP,
  `created_by` varchar(50),
  `updated_by` varchar(50),

  CONSTRAINT `PK_USER_ID` PRIMARY KEY (`id`,`username`),
  
  KEY `FK_DEPARTMENT_IDX_01` (`department_id`),
  
  CONSTRAINT `FK_DEPARTMENT_ID_01` FOREIGN KEY (`department_id`) 
  REFERENCES `department` (`id`) 
  ON DELETE NO ACTION ON UPDATE NO ACTION
  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


--
-- Create a department table
--

CREATE TABLE `department` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `status` varchar(2) NOT NULL DEFAULT 'A',
  `creation_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updation_date` TIMESTAMP,
  `created_by` varchar(50),
  `updated_by` varchar(50),

  PRIMARY KEY (`id`)
  
 
  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

--
-- Add department_hod table
--

CREATE TABLE `department_hod` (
  `department_id` int(11) NOT NULL,
  `username` varchar(50) NOT NULL,
  
  PRIMARY KEY (`username`,`department_id`),
  
  KEY `FK_DEPARTMENT_idx_02` (`department_id`),
  
  CONSTRAINT `FK_DEPARTMENT_id_02` FOREIGN KEY (`department_id`) 
  REFERENCES `department` (`id`) 
  ON DELETE NO ACTION ON UPDATE NO ACTION,
  
  CONSTRAINT `FK_USER_01` FOREIGN KEY (`username`) 
  REFERENCES `user` (`username`) 
  ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

SET FOREIGN_KEY_CHECKS = 1;

错误在这里

CONSTRAINT `FK_USER_01` FOREIGN KEY (`username`) 
  REFERENCES `user` (`username`) 
  ON DELETE NO ACTION ON UPDATE NO ACTION

错误是

Error Code: 1215. Cannot add foreign key constraint

1 个答案:

答案 0 :(得分:0)

始终提供完整的错误消息。在一半的选择中,您可能会在其中找到解决方案。

对于您的代码,错误消息是

<块引用>

未能添加外键约束。引用表 'user' 中缺少约束 'FK_USER_01' 的索引

所以这个问题可以通过不创建索引来解决:

CREATE INDEX idx_user_username ON user (username);

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=1f0fd24a8eb9cb5692b9d35dd1903045


<块引用>

你能告诉我这里有必要使用索引吗?因为它仅用于加速,所以我是否必须因为用户表中有两个主键而使用它? – shah-123

MySQL 8.0 Reference Manual / ... / FOREIGN KEY Constraints / Conditions and Restrictions

<块引用>

MySQL 需要外键和引用键的索引,以便外键检查可以快速并且不需要表扫描。 在引用表中,必须有一个索引,其中外键列以相同的顺序列在第一列。如果引用表不存在,则会在引用表上自动创建这样的索引。如果您创建另一个可用于强制执行外键约束的索引,则此索引可能会在稍后被静默删除。 index_name,如果给定,则按前面所述使用。