¿我做错了什么?

时间:2019-08-14 19:37:40

标签: mysql sql

我正在尝试使用此sql代码创建一个表:

CREATE TABLE IF NOT EXISTS `Proyecto2019`.`matricular` (
  `dni` INT(10) NOT NULL,
  `id_carrera` INT(4) NOT NULL,
  `id_año` INT(1) NOT NULL,
  `id_materia` INT(4) NOT NULL,
  `estado` VARCHAR(45) NULL,
  `id_login` VARCHAR(10) NULL,
  `fecha_login` VARCHAR(10) NULL,
  PRIMARY KEY (`dni`, `id_carrera`, `id_materia`, `id_año`),
  INDEX `id_carrera_idx` (`id_carrera` ASC),
  INDEX `id_materia_idx` (`id_materia` ASC),
  CONSTRAINT `fk_dni`
    FOREIGN KEY (`dni`)
    REFERENCES `Proyecto2019`.`dm_alumnos` (`dni`)
,
  CONSTRAINT `fk_id_carrera`
    FOREIGN KEY (`id_carrera`)
    REFERENCES `Proyecto2019`.`dm_carreras` (`id_carrera`)
,
  CONSTRAINT `fk_id_materia`
    FOREIGN KEY (`id_materia`)
    REFERENCES `Proyecto2019`.`dm_materias` (`id_materia`)
)
ENGINE = InnoDB

我得到以下错误:

  

1005-无法创建表proyecto2019matricular(错误号:121“写入或更新时出现重复键”)

有什么错误?我找不到

1 个答案:

答案 0 :(得分:1)

通常,当您已经有一个具有该名称的FK时,会发生这种情况。您对FK的命名策略确实看起来很可能导致冲突。当我命名FK时,我将表名和列名放在其中:

CONSTRAINT `fk_mattricular_id_carrera__dm_carreras_id_carrera`
FOREIGN KEY (`id_carrera`)
REFERENCES `Proyecto2019`.`dm_carreras` (`id_carrera`)

名称最多可以包含64个字符。用模式fk_a_b__c_d减去7个字符以表示FK和下划线,表示表/列名称(ab,cd)每个最多可以包含14个字符(如果您想使用“以14个字符为单位切”的规则)。你说他们取决于你,我倾向于做fk_childtab_childcol__parenttab_parentcol

我从我认为的旧SQLserver养成了这种习惯;该错误消息过去在“违反约束'fk_whatever'方面”无济于事-它没有说哪个列引用了引起问题的其他列,但是很好地命名了fk提供了更多的线索。这也有助于避免命名冲突,因为除非您有两个表/列的名称很长且仅在最后几个字符不同,否则重复的可能性很小