4

大学での課題として、初めての MySQL データベースに取り組んでいます。残念ながら、その間に外部キーを持つ実際のテーブルを作成しようとしてしばらく立ち往生していました。

これは、MySQL Workbench フォワード エンジニアリング ウィザードが表示するエラーです。

サーバーで SQL スクリプトを実行しています

ERROR: Error 1005: Can't create table 'test.fremført' (errno: 150)    

CREATE  TABLE IF NOT EXISTS `Fremført` (    
  `Plate` VARCHAR(20) NOT NULL ,
  `Verk` VARCHAR(45) NOT NULL ,
  `Artist` VARCHAR(45) NOT NULL ,
  `Dato` DATE NULL ,
  PRIMARY KEY (`Plate`, `Verk`, `Artist`) ,
  INDEX `Fremført->Artist_idx` (`Artist` ASC) ,
  INDEX `Fremført->Spor_idx` (`Plate` ASC, `Verk` ASC) ,
  CONSTRAINT `Fremført->Artist`
    FOREIGN KEY (`Artist` )
    REFERENCES `Artist` (`ArtistNavn` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Fremført->Spor`
    FOREIGN KEY (`Plate` , `Verk` )
    REFERENCES `Spor` (`Verk` , `Verk` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

上記のスクリプトの何が問題なのかを知っている人はいますか?もしそうなら、解決策はありますか?

ありがとう!

編集: これは要求された spor クエリです

DROP TABLE IF EXISTS `Spor` ;
CREATE  TABLE IF NOT EXISTS `Spor` (
  `Plate` VARCHAR(45) NOT NULL ,
  `Verk` VARCHAR(45) NOT NULL ,
  `Spilletid` DECIMAL(3,2) NULL ,
  PRIMARY KEY (`Plate`, `Verk`) ,
  INDEX `Plate_idx` (`Plate` ASC) ,
  CONSTRAINT `Plate`
    FOREIGN KEY (`Plate` )
    REFERENCES `Plate` (`KatalogNr` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



DROP TABLE IF EXISTS `Artist` ;
CREATE  TABLE IF NOT EXISTS `Artist` (
  `ArtistNavn` VARCHAR(30) NOT NULL ,
  `Artistcol` VARCHAR(45) NULL ,
  PRIMARY KEY (`ArtistNavn`) )
ENGINE = InnoDB;
4

3 に答える 3

3

errno150は、多くの場合、プライマリ列と関連列のデータ型の不一致に関連しています。文字の長さも含めて、正確に一致する必要があります。

Fremført.artistVARCHAR(45))とArtist.ArtistNavn( )の間にデータ型の不一致がありVARCHAR(30)ます。FOREIGN KEY制約が成功するには、これらは同じである必要があります。

CREATE  TABLE IF NOT EXISTS `Fremført` (    
  `Plate` VARCHAR(20) NOT NULL ,
  `Verk` VARCHAR(45) NOT NULL ,
  /* Must match the primary table VARCHAR(30) */
  `Artist` VARCHAR(30) NOT NULL ,
  `Dato` DATE NULL ,
  PRIMARY KEY (`Plate`, `Verk`, `Artist`) ,
  INDEX `Fremført->Artist_idx` (`Artist` ASC) ,
  INDEX `Fremført->Spor_idx` (`Plate` ASC, `Verk` ASC) ,
  CONSTRAINT `Fremført->Artist`
    FOREIGN KEY (`Artist` )
    REFERENCES `Artist` (`ArtistNavn` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Fremført->Spor`
    FOREIGN KEY (`Plate` , `Verk` )
    /* Was this intentional, rather than (`Plate`, `Verk`)? */
    /* If not, you must also match the data type of `Plate` VARCHAR(20) to that of Spor.Plate VARCHAR(45) */
    REFERENCES `Spor` (`Verk` , `Verk` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

上記のように、制約が定義したものではなくFremført->Spor参照することを意図した場合、との間の型の不一致が原因でerr150も発生します。に変更します。Spor (Plate , Verk )Spor (Verk , Verk )Spor.PlateFremført.PlateFremført.PlateVARCHAR(45)

于 2012-10-10T20:14:18.957 に答える
0

エラー 150 は外部キー制約の問題です。あなたが持っている 2 つの FK のうちの 1 つに問題があると思われます。

参照: http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

于 2012-10-10T20:10:11.503 に答える
0

(errno: 150)そのエラーは、FK が失敗したことを意味するため、テーブルの作成も....

FK を確認してください。

  • もう作成しましたか?(PK がこのテーブルを指しているテーブル)
  • あなたのスペルは正しかったですか?
  • PK と同じデータ型ですか?
于 2012-10-10T20:10:20.660 に答える