#mysql
#mysql
Вопрос:
Я пытаюсь создать два столбца с одинаковым внешним ключом. Это ошибка в Mysql. ОШИБКА
errno: 150 “Foreign key constraint is incorrectly formed”
СКРИПТ
CREATE TABLE IF NOT EXISTS `invictus`.`Votaciones` (
`idVotaciones` INT NOT NULL AUTO_INCREMENT,
`mvp` INT NOT NULL,
`idPartido-Jugador` INT NOT NULL,
`votante` INT NOT NULL,
PRIMARY KEY (`idVotaciones`),
INDEX `fk_Votaciones_Partido-Jugadores_idx` (`mvp` ASC, `idPartido-Jugador` ASC, `votante` ASC),
CONSTRAINT `fk_Votaciones_Partido-Jugadores`
FOREIGN KEY (`mvp` , `idPartido-Jugador` , `votante`)
REFERENCES `invictus`.`Partido-Jugadores` (`Jugador_idJugador` , `Equipos_Partido_idPartido` , `Jugador_idJugador`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
РЕДАКТИРОВАТЬ 1
Вот таблица Partido-Jugadores, где я хочу ссылаться на мои два столбца с помощью Jugador_idJugador
CREATE TABLE IF NOT EXISTS `invictus`.`Partido-Jugadores` (
`idPartido-Jugadores` INT NOT NULL AUTO_INCREMENT,
`Equipos_idEquipos` INT NOT NULL,
`Equipos_Partido_idPartido` INT NOT NULL,
`Equipos_Partido_fecha` DATETIME NOT NULL,
`Equipos_Partido_Grupo_idGrupo` INT NOT NULL,
`Equipos_nombreEquipo` VARCHAR(45) NOT NULL,
`Jugador_idJugador` INT NOT NULL,
PRIMARY KEY (`idPartido-Jugadores`, `Equipos_idEquipos`, `Equipos_Partido_idPartido`, `Equipos_Partido_fecha`, `Equipos_Partido_Grupo_idGrupo`, `Equipos_nombreEquipo`, `Jugador_idJugador`),
INDEX `fk_Partido-Jugadores_Equipos1_idx` (`Equipos_idEquipos` ASC, `Equipos_Partido_idPartido` ASC, `Equipos_Partido_fecha` ASC, `Equipos_Partido_Grupo_idGrupo` ASC, `Equipos_nombreEquipo` ASC),
INDEX `fk_Partido-Jugadores_Jugador1_idx` (`Jugador_idJugador` ASC),
CONSTRAINT `fk_Partido-Jugadores_Equipos1`
FOREIGN KEY (`Equipos_idEquipos` , `Equipos_Partido_idPartido` , `Equipos_Partido_fecha` , `Equipos_Partido_Grupo_idGrupo` , `Equipos_nombreEquipo`)
REFERENCES `invictus`.`Equipos` (`idEquipos` , `Partido_idPartido` , `Partido_fecha` , `Partido_Grupo_idGrupo` , `nombreEquipo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Partido-Jugadores_Jugador1`
FOREIGN KEY (`Jugador_idJugador`)
REFERENCES `invictus`.`Miembros-Grupo` (`Jugador_idJugador`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
В чем проблема?
Спасибо!
Ответ №1:
Если вам нужен правильный синтаксис, вам нужно будет показать, как выглядит первичный ключ для Partido-Jugadores
.
Однако вы дважды повторили столбец в ссылке на внешний ключ:
REFERENCES `invictus`.`Partido-Jugadores` (**`Jugador_idJugador`**, `Equipos_Partido_idPartido` , **`Jugador_idJugador`**)
Я никогда не пробовал этого, но я предполагаю, что это ошибка в определении первичного ключа и ошибка в ссылке на внешний ключ. Используйте соответствующее определение первичного ключа.
Редактировать:
Если у вас есть столбец с автоматическим увеличением в Partido-Jugadores
, то это должен быть первичный ключ. Это само по себе, и больше ничего:
PRIMARY KEY (`idPartido-Jugadores`),
Тогда ссылка на внешний ключ будет:
CONSTRAINT `fk_Votaciones_Partido-Jugadores`
FOREIGN KEY (`idPartido-Jugador)
REFERENCES `invictus`.`Partido-Jugadores` (`Jugador_idJugadores`)
ON DELETE NO ACTION ON UPDATE NO ACTION
Примечания:
- На мой взгляд, первичный ключ следует называть в единственном числе.
- Вы не должны использовать
-
в именах таблиц или столбцов. Вместо этого используйте_
в качестве разделителя. Таким образом, идентификаторы не нужно экранировать.
Комментарии:
1. Я добавил Partido-Jugadores в свои вопросы. В моей таблице Votaciones столбцы mvp и votante относятся к Jugador_idJugador в разделе-Jugadores . Jugador_idJugador должен быть с первичным ключом?