0

WorkBench で作成したモデルからスクリプトをフォワード エンジニアリングしましたが、スクリプトが失敗し続けます。2 番目の create table で失敗します。

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;

何が起こっているのですか?

編集============================

2 つの FK を持つテーブル:

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;
4

2 に答える 2

2

もしも

`UserId` INT NOT NULL AUTO_INCREMENT

元のテーブルにある場合、派生テーブルでもまったく同じ構文が必要です。

`UserId` VARCHAR( 45 ) NOT NULL 

する必要があります

`UserId` INT NOT NULL 

UserIdまた、両方のテーブルのフィールドにインデックスを付ける必要があります。それは1つでPRIMARYなので、そこには必要ありません。別の追加で:

INDEX `uid`( `UserId` )
于 2013-04-12T22:43:24.620 に答える
0

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

データベースのテーブルを参照しますOurAgreement

REFERENCES  `OurAgreement`.`UserAccount`

ただし、UserAccount前に作成したテーブルは次のとおりですmydatabase

CREATE  TABLE IF NOT EXISTS `mydatabase`.`UserAccount`
于 2013-04-12T22:48:54.700 に答える