Я попытался создать внешние ключи в моей таблице Movie_Copies, которая ссылается на первичные ключи в таблицах Movie_Details и Customer_Details, но, похоже, у меня это не работает, и синтаксическая ошибка, которая появляется, похоже, связана с индексацией.
-- -----------------------------------------------------
-- Table `Movie_Renting`.`Movie_Details`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Movie_Renting`.`Movie_Details` (
`Movie_ID` VARCHAR(20) NOT NULL,
`Movie_Title` VARCHAR(256) NOT NULL,
`Release_Date` DATE NOT NULL,
`Run_Time` VARCHAR(10) NOT NULL,
`Genre` VARCHAR(20) NOT NULL,
`Rating` INT NOT NULL,
`Number_of_Copies` INT NOT NULL,
PRIMARY KEY (`Movie_ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Movie_Renting`.`Customer_Details`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Movie_Renting`.`Customer_Details` (
`Customer_ID` VARCHAR(10) NOT NULL,
`Customer_Name` VARCHAR(800) NOT NULL,
`Address_Line_One` VARCHAR(100) NOT NULL,
`Address_Line_Two` VARCHAR(100) NULL,
`Town` VARCHAR(90) NOT NULL,
`Post_Code` VARCHAR(8) NOT NULL,
`Contact_Number` VARCHAR(12) NOT NULL,
`Email_Address` VARCHAR(345) NOT NULL,
PRIMARY KEY (`Customer_ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Movie_Renting`.`Movie_Copies`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Movie_Renting`.`Movie_Copies` (
`Copy_ID` VARCHAR(10) NOT NULL,
`Movie_ID` VARCHAR(10) NOT NULL,
`Platform` VARCHAR(20) NOT NULL,
`Customer_ID` VARCHAR(45) NOT NULL,
`Rent_Out` DATE NOT NULL,
`Duration_Weeks` INT NOT NULL,
`Return_Date` DATE NOT NULL,
`Customer_Details_Customer_ID` VARCHAR(10) NOT NULL,
PRIMARY KEY (`Copy_ID`),
INDEX `fk_Movie_Copies_Movie_Details_idx` (`Movie_ID` ASC) VISIBLE,
INDEX `fk_Movie_Copies_Customer_Details1_idx` (`Customer_ID` ASC) VISIBLE,
CONSTRAINT `fk_Movie_Copies_Movie_Details`
FOREIGN KEY (`Movie_ID`)
REFERENCES `Movie_Renting`.`Movie_Details` (`Movie_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Movie_Copies_Customer_Details1`
FOREIGN KEY (`Customer_ID`)
REFERENCES `Movie_Renting`.`Customer_Details` (`Customer_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Я только что попробовал, но получаю сообщение об ошибке; ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис рядом с '' fk_Movie_Copies_Movie_Details_idx '(' Movie_ID 'ASC), INDEX' fk_Movie_Copies_C 'в строке 10
Я вырезал и вставил ваш код (без VISIBLE) на свой сервер MySQL 5.6, и он отлично работает.
Я заметил, что длины строк столбцов в таблице Movie_Copies не совпадают с длинами соответствующих столбцов в таблицах Customer_Details и Movie_Details. Я знал, что MySQL немного нервничает по поводу подобных вещей.






Ключевое слово
VISIBLEнедоступно, если вы не используете MySQL 8.0 или новее. Вы можете безопасно удалить его, если используете MySQL <8.0