我正在尝试使用此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-无法创建表
proyecto2019
。matricular
(错误号:121“写入或更新时出现重复键”)
有什么错误?我找不到
答案 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提供了更多的线索。这也有助于避免命名冲突,因为除非您有两个表/列的名称很长且仅在最后几个字符不同,否则重复的可能性很小