0

create tableMySQLのステートメントに問題があります。

シナリオは、P_CDPいくつかの情報を格納するテーブルP_CDPFilesと、アップロードされたファイルのデータを格納するテーブルが必要です。

ユーザーがファイルを選択しない限り、デフォルトの列SelectedCDPFileIDはになっているはずです。NULL次に、その列にファイルIDが入力されます。しかし、私はまだerrno 150を取得しています、なぜですか?FKの名前はきちんと設定されていると思います

CREATE TABLE `P_CDP` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `P_OrderID` int(11) NOT NULL DEFAULT '0',
  `SelectedCDPFileID` int(11) NULL,
  PRIMARY KEY (`ID`),
  KEY `FK_P_CDP_P_Orders` (`P_OrderID`),
  KEY `FK_P_CDP_P_CDPFiles` (`SelectedCDPFileID`),
  CONSTRAINT `FK_P_CDP_P_Orders` FOREIGN KEY (`P_OrderID`) REFERENCES `P_Orders` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_P_CDP_P_CDPFiles` FOREIGN KEY (`SelectedCDPFileID`) REFERENCES `P_CDPFiles` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `P_CDPFiles` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `FileID` int(11) NOT NULL DEFAULT '0',
  `P_CDPID` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `FK_P_CDPFiles_File` (`FileID`),
  KEY `FK_P_CDPFiles_P_CDP` (`P_CDPID`),
  CONSTRAINT `FK_P_CDPFiles_File` FOREIGN KEY (`FileID`) REFERENCES `File` (`FileID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_P_CDPFiles_P_CDP` FOREIGN KEY (`P_CDPID`) REFERENCES `P_CDP` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
4

1 に答える 1

2

まだ存在していないテーブルを参照しようとしています。

これらの2つのテーブル間で両方向の参照が必要な場合(通常、設計が非常に貧弱であることを示します)、次のことを行う必要があります。

  1. まだ定義されていないテーブルを参照せずに、最初のテーブルを作成します。

    CREATE TABLE `P_CDP` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `P_OrderID` int(11) NOT NULL DEFAULT '0',
      `SelectedCDPFileID` int(11) NULL,
      PRIMARY KEY (`ID`),
      KEY `FK_P_CDP_P_Orders` (`P_OrderID`),
      KEY `FK_P_CDP_P_CDPFiles` (`SelectedCDPFileID`),
      CONSTRAINT `FK_P_CDP_P_Orders` FOREIGN KEY (`P_OrderID`)
        REFERENCES `P_Orders` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
  2. 最初のテーブルへの参照を含めて、2番目のテーブルを作成します。

    CREATE TABLE `P_CDPFiles` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `FileID` int(11) NOT NULL DEFAULT '0',
      `P_CDPID` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`ID`),
      KEY `FK_P_CDPFiles_File` (`FileID`),
      KEY `FK_P_CDPFiles_P_CDP` (`P_CDPID`),
      CONSTRAINT `FK_P_CDPFiles_File` FOREIGN KEY (`FileID`)
        REFERENCES `File` (`FileID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      CONSTRAINT `FK_P_CDPFiles_P_CDP` FOREIGN KEY (`P_CDPID`)
        REFERENCES `P_CDP` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
  3. 最初のテーブルを変更して、目的の制約を追加します。

    ALTER TABLE `P_CDP`
      ADD CONSTRAINT `FK_P_CDP_P_CDPFiles` FOREIGN KEY (`SelectedCDPFileID`)
      REFERENCES `P_CDPFiles` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION;
    
于 2012-09-15T13:18:23.633 に答える