2013-04-12 2 views
0

Я перепрограммировал сценарий из модели, созданной в WorkBench, но скрипт продолжает работать с ошибкой. Он не работает во второй таблице создания:mysql create table script failed - ошибка 150

CREATE TABLE IF NOT EXISTS `myDatabase`.`UserProfile` (

`ProfileId` INT NOT NULL AUTO_INCREMENT , 
`FirstName` VARCHAR(45) NULL , 
`LastName` VARCHAR(45) NULL , 
`Gender` CHAR(1) NULL , 
`DOB` DATETIME NULL , 
`HairColor` VARCHAR(20) NULL DEFAULT 'No Answer', 
`EyeColor` VARCHAR(20) NULL DEFAULT 'No Answer', 
`Height` VARCHAR(10) NULL DEFAULT 'No Answer', 
`Weight` VARCHAR(45) NULL DEFAULT 'Average', 
`UserId` VARCHAR(45) NOT NULL , 
PRIMARY KEY ( `ProfileId`) , 
CONSTRAINT `FK_User_Profile` FOREIGN KEY ( `UserId`) REFERENCES `OurAgreement`.`UserAccount`  (
`UserId` 
) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = INNODB; 

Я считаю, что ошибка 150 является проблемой внешнего ключа. Таблица, связанная с этим FK, создает сначала скрипт, поэтому он существует до того, как будет предпринято это ограничение. Вот DDL для этой таблицы:

CREATE TABLE IF NOT EXISTS `mydatabase`.`UserAccount` (
    `UserId` INT NOT NULL AUTO_INCREMENT , 
    `Login` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL , 
    `Password` CHAR(64) NOT NULL , 
    `Email` VARCHAR(45) NULL , 
    PRIMARY KEY (`UserId`)) 
ENGINE = InnoDB; 

Любые идеи, что происходит?

EDIT ============================

стол с 2 FKS:

CREATE TABLE IF NOT EXISTS `MyDatabase`.`Answer` (

`AnswerId` INT NOT NULL , 
    `QuestionId` INT NOT NULL , 
`ProfileId` INT NOT NULL , 
PRIMARY KEY ( `AnswerId`) , 
INDEX `ProfileId_idx` ( `ProfileId` ASC) , 
INDEX `QuestionId_idx` ( `QuestionId` ASC) , 
CONSTRAINT `FK_Question_Answer` FOREIGN KEY ( `QuestionId`) REFERENCES `MyDatabase`.`Question` (
`QuestionId` 
) ON DELETE NO ACTION ON UPDATE CASCADE , 
CONSTRAINT `FK_Answer_Profile` FOREIGN KEY ( `ProfileId`) REFERENCES `MyDatabase`.`UserProfile` (
`ProfileId` 
) ON DELETE NO ACTION ON UPDATE CASCADE 
) ENGINE = INNODB; 

ответ

2

Если

`UserId` INT NOT NULL AUTO_INCREMENT 

находится в исходной таблице, вам нужно точно такой же синтаксис в производной таблице:

`UserId` VARCHAR(45) NOT NULL 

должен быть

`UserId` INT NOT NULL 

Кроме того, вам нужно индексировать поля UserId в обеих таблицах. Потому что это ПЕРВЫЙ в одном, поэтому там не нужно. В другом добавить:

INDEX `uid`(`UserId`) 
+0

здесь вы идете, вторая часть сделает это. – Sebas

+0

@Sebas Оба они необходимы^_^ – hjpotter92

+0

да, вы правы, я на самом деле означал, что вторая часть закончит решение проблемы. – Sebas

0

В

CREATE TABLE IF NOT EXISTS `myDatabase`.`UserProfile` 

вы ссылаетесь таблицу в базе данных OurAgreement:

REFERENCES `OurAgreement`.`UserAccount` 

но таблица UserAccount вы создаете более ранней в mydatabase:

CREATE TABLE IF NOT EXISTS `mydatabase`.`UserAccount` 
Смежные вопросы