Создание внешнего ключа MySQL с помощью команды alter table - PullRequest
1 голос
/ 10 апреля 2010

Я создал несколько таблиц с помощью MySQL Workbench, а затем направил «инженера-форвардера» для создания сценариев для создания этих таблиц. НО, сценарии приводят меня к ряду проблем. Один из которых включает в себя внешние ключи. Поэтому я попытался создать отдельные дополнения внешнего ключа, используя alter table, и у меня все еще есть проблемы. Код ниже (операторы set, операторы drop / create, которые я оставил ... хотя я не думаю, что они должны иметь значение для этого):

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `mydb` ;
 CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;

 -- -----------------------------------------------------
 -- Table `mydb`.`User`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User` (
   `UserName` VARCHAR(35) NOT NULL ,
   `Num_Accts` INT NOT NULL ,
   `Password` VARCHAR(45) NULL ,
   `Email` VARCHAR(45) NULL ,
   `User_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_ID`) )
 ENGINE = InnoDB;


 -- -----------------------------------------------------
 -- Table `mydb`.`User_Space`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User_Space` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User_Space` (
   `User_UserName` VARCHAR(35) NOT NULL ,
   `User_Space_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_Space_ID`),
 FOREIGN KEY (`User_UserName`)
 REFERENCES `mydb`.`User` (`UserName`)
 ON UPDATE CASCADE ON DELETE CASCADE)
 ENGINE = InnoDB;

 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Это ошибка:
Код ошибки: 1005 Не удается создать таблицу «mydb.user_space» (номер ошибки: 150)

Кто-нибудь знает, какого чёрта я делаю не так ?? И у кого-нибудь еще есть проблемы с генерацией скриптов, выполняемых версткой mysql? Это хороший инструмент, но раздражает, что он выдает скрипты, которые не работают для меня.

[К вашему сведению, скрипт, который он генерирует автоматически:

 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

 DROP SCHEMA IF EXISTS `mydb` ;
 CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;

 -- -----------------------------------------------------
 -- Table `mydb`.`User`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User` (
   `UserName` VARCHAR(35) NOT NULL ,
   `Num_Accts` INT NOT NULL ,
   `Password` VARCHAR(45) NULL ,
   `Email` VARCHAR(45) NULL ,
   `User_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_ID`) )
 ENGINE = InnoDB;


 -- -----------------------------------------------------
 -- Table `mydb`.`User_Space`
 -- -----------------------------------------------------
 DROP TABLE IF EXISTS `mydb`.`User_Space` ;

 CREATE  TABLE IF NOT EXISTS `mydb`.`User_Space` (
   `User_Space_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_Space_ID`) ,
   INDEX `User_ID` () ,
   CONSTRAINT `User_ID`
     FOREIGN KEY ()
     REFERENCES `mydb`.`User` ()
     ON DELETE NO ACTION
     ON UPDATE NO ACTION)
 ENGINE = InnoDB;


 SET SQL_MODE=@OLD_SQL_MODE;
 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

** Спасибо!]

1 Ответ

2 голосов
/ 10 апреля 2010

Я не использовал MySQL Workbench для генерации большого количества схем, но я нашел проблему в скрипте. Определение внешнего ключа в таблице User_Space пытается создать внешний ключ для неиндексированного столбца в таблице User. Если вы измените определение User на индекс UserName, например:

  CREATE  TABLE IF NOT EXISTS `mydb`.`User` (
   `UserName` VARCHAR(35) NOT NULL ,
   `Num_Accts` INT NOT NULL ,
   `Password` VARCHAR(45) NULL ,
   `Email` VARCHAR(45) NULL ,
   `User_ID` INT NOT NULL AUTO_INCREMENT ,
   PRIMARY KEY (`User_ID`),
   INDEX(`UserName`)
 )
 ENGINE = InnoDB;

... скрипт завершится успешно. Похоже, что MySQL Workbench, вероятно, не учитывает индексы, когда генерирует определения внешнего ключа. Я не уверен, что вы можете исправить это на ваших схемах или это большая ошибка в программе, но я бы посмотрел, можете ли вы добавить определения индекса в нужных местах и ​​определить, исправляет ли это генерацию скрипта. *

...