MySQL Workbench错误1005无法创建表

时间:2017-04-19 02:06:44

标签: mysql

所以我对MySQL很非常新但是我想我到目前为止已经掌握了相当多的东西。我正在努力创建表pageAction.show()。在我自己的研究之后,我几乎是肯定的,它与表中的键有关。但我不明白问题在哪里或如何解决。

下面的SQL查询会为项目创建所有表。我不确定这个问题,因为我现在只收到项目的错误代码。任何有关导致此问题以及如何在代码中纠正此问题的见解和建议将不胜感激。

PROJECT

2 个答案:

答案 0 :(得分:0)

通常在无法创建外键时会出现错误1005。在创建外键约束时,父表应该在数据库中可用。

在您的情况下,'employee'表中有一个FK到'department'表,但您在创建'department'表之前尝试创建'employee'表。 “部门”表也有一个FK回到“员工”表。因此,您无法首先创建“部门”表。要解决此问题,您可以先创建“部门”表,而不要将FK创建为“员工”表。然后创建'employee'表,然后用FK更改'department'表。

以下是前两个表的修改代码,如果出现相同的错误,请按照相同的模式进行休息。

CREATE TABLE IF NOT EXISTS `ebrasi1db`.`department` (
`dnumber` INT(11) NOT NULL,
  `dname` VARCHAR(45) NULL DEFAULT NULL,
  `mgrssn` VARCHAR(10) NULL DEFAULT NULL,
  `mgrstartdate` DATE NULL DEFAULT NULL,
  PRIMARY KEY (`dnumber`),
  INDEX `mgrssn_idx` (`mgrssn` ASC))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `ebrasi1db`.`employee` (
  `ssn` VARCHAR(10) NOT NULL,
  `fname` VARCHAR(45) NULL DEFAULT NULL,
  `minit` VARCHAR(1) NULL DEFAULT NULL,
  `lname` VARCHAR(45) NULL DEFAULT NULL,
  `bdate` DATE NULL DEFAULT NULL,
  `address` VARCHAR(45) NULL DEFAULT NULL,
  `sex` VARCHAR(1) NULL DEFAULT NULL,
  `salary` INT(11) NULL DEFAULT NULL,
  `superssn` VARCHAR(10) NULL DEFAULT NULL,
  `dno` INT(11) NULL DEFAULT NULL,
  PRIMARY KEY (`ssn`),
  INDEX `superssn_idx` (`superssn` ASC),
  INDEX `dno_idx` (`dno` ASC),
  CONSTRAINT `superssn`
    FOREIGN KEY (`superssn`)
    REFERENCES `ebrasi1db`.`employee` (`ssn`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `dno`
    FOREIGN KEY (`dno`)
    REFERENCES `ebrasi1db`.`department` (`dnumber`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

 ENGINE = InnoDB;


alter table department  add
  CONSTRAINT `mgrssn`
    FOREIGN KEY (`mgrssn`)
    REFERENCES `ebrasi1db`.`employee` (`ssn`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

答案 1 :(得分:0)

您的问题主要在于您尝试为非键列创建约束(因为引用的表具有双键)。

在您的表project中,您有:

CONSTRAINT `plocation`
FOREIGN KEY (`plocation`)
REFERENCES `dept_locations` (`dlocation`)
ON DELETE NO ACTION
ON UPDATE NO ACTION

dept_locations.dlocation不是关键字ALONE(主键),因此您无法创建该约束。

您需要对引用的表中的两个键进行约束,如下所示:

CONSTRAINT `plocation`
FOREIGN KEY (`pnumber`, `plocation`)
REFERENCES `dept_locations` (`dnumber`, `dlocation`)
ON DELETE NO ACTION
ON UPDATE NO ACTION

在这种情况下,您不需要第一个约束dnum,因为它已在dept_locations表中引用。

另请注意,您的表departmentemployee将不会被创建,因为一个引用另一个,因此您需要先创建表而不使用约束,然后应用以下约束:

ALTER TABLE `employee` add 
CONSTRAINT `dno`
FOREIGN KEY (`dno`)
REFERENCES `department` (`dnumber`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

department表及其对employee

的约束相同