我创建使用MySQL工作台一些表,然后做正向“正向工程”创建脚本来创建这些表。但这些脚本使我许多问题。其中之一涉及到外键。所以,我尝试使用ALTER TABLE创建单独的外键的添加和我仍然得到问题。代码如下(在一组语句,删除/创建报表我离开......虽然我不认为他们应该的问题,这个):

 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工作台做的问题?这是一个很好的工具,但烦人,它泵出,不工作的脚本给我。

FYI这里

[作为一个是它自动产生脚本:

 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;

** 谢谢!]

有帮助吗?

解决方案

我没有使用MySQL工作台产生了很多的模式,但我发现在脚本中的问题。在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工作台可能不考虑指标考虑在内时,它生成的外键定义。我不知道,如果你可以在你的模式图,或者如果它在程序中的错误更大的解决这个问题,但我会看,如果你能在正确的地方添加索引定义,并确定是否能解决脚本生成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top