0

次のスクリプトを使用して、NetBankingTransaction テーブルを作成しようとすると、次のメッセージで失敗します。

エラー コード: 1005。テーブル 'wah_schema.netbankingtransaction' を作成できません (errno: 150)

DB スクリプト:

CREATE  TABLE IF NOT EXISTS `wah_schema`.`Transaction` (
  `idTransaction` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `idOrder` INT UNSIGNED NOT NULL ,
  `type` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`idTransaction`, `idOrder`, `type`) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `wah_schema`.`NetBankingTransaction` (
  `idTransaction` INT NOT NULL ,
  `bankCode` VARCHAR(45) NOT NULL ,
  `type` VARCHAR(45) NOT NULL DEFAULT 'NETBANKING' ,
  PRIMARY KEY (`idTransaction`, `type`) ,
  INDEX `fk_NetBankingTransaction_Transaction1` (`idTransaction` ASC, `type` ASC) ,
  CONSTRAINT `fk_NetBankingTransaction_Transaction1`
    FOREIGN KEY (`idTransaction` , `type` )
    REFERENCES `wah_schema`.`Transaction` (`idTransaction` , `type` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

なぜこのエラーが発生するのか理解してもらえますか?

4

3 に答える 3

0

その外部キー制約を適切に追加するには、 UNIQUE KEYinが必要です。Transaction (idTransaction, type)

于 2012-04-18T09:37:32.470 に答える
0

idTransaction は、各テーブルで異なる型です。1 つは無署名で、もう 1 つは署名されています。2 番目のテーブルで idTransaction を unsigned にしてみてください。

于 2012-04-18T09:38:15.597 に答える
0

これは私のために働きます:

/*drop table if exists `Transaction`;*/
CREATE  TABLE IF NOT EXISTS `Transaction` (
  `idTransaction` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `idOrder` INT UNSIGNED NOT NULL ,
  `type` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`idTransaction`, `idOrder`, `type`), 
  key idx_idTransaction_type (idTransaction, `type`))
ENGINE = InnoDB;

/*drop table if exists NetBankingTransaction;*/
CREATE  TABLE IF NOT EXISTS `NetBankingTransaction` (
  `idTransaction` INT UNSIGNED NOT NULL ,
  `bankCode` VARCHAR(45) NOT NULL ,
  `type` VARCHAR(45) NOT NULL DEFAULT 'NETBANKING' ,
  PRIMARY KEY (`idTransaction`, `type`)
 , CONSTRAINT `fk_NetBankingTransaction_Transaction1`
    FOREIGN KEY (`idTransaction` , `type` )
    REFERENCES `Transaction` (`idTransaction` , `type` )
    ON DELETE CASCADE
    ON UPDATE CASCADE
    )
ENGINE = InnoDB;

NetBankingTransaction テーブルの idTransaction は署名されていない必要があります。また、テーブルの (idTransaction, type) にインデックスが必要です。Transaction主キーは 3 つの列を超えているため、FK リクエリーをカバーしていません。

PS: NetBankingTransaction テーブルではこれは必要ありません

インデックスfk_NetBankingTransaction_Transaction1( idTransactionASC、typeASC)

于 2012-04-18T10:35:13.877 に答える