0

良い一日

3 つのテーブル間の外部キー関係の問題を解決しようとしています。基本的に、2 つのセカンダリ テーブルがあり、それぞれに 2 つの外部キーがあり、各外部キーは 3 番目のテーブルの 1 つの主キーを参照しています。

これと同じ問題は、はるかに大規模なデータベースで発生しますが、その複雑さ、サイズ、および著作権の問題が原因で発生する可能性があります。問題を切り分けて、同じ問題が発生するレプリカを作成するしかありませんでした。ただし、メイン テーブルを参照する同じ 2 つのテーブルPeopleは、問題のデータベース内の数十の同じ種類の宇宙の 2 つに過ぎないことを知っておく必要があります。

私の希望は、誰かが問題を指摘し、おそらく現在の構造にほとんど影響を与えない解決策を提供してくれることです。これにより、おそらく他のすべてのテーブルにそれを自分で適用できるようになります。彼らは皆、同じ問題に苦しむでしょう。データベースの作成者は私のものではありません。これは、図を見るときに混乱を招くだけです。

SQL 作成スクリプト:

CREATE SCHEMA IF NOT EXISTS `sampleBD` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `sampleBD` ;

-- -----------------------------------------------------
-- Table `sampleBD`.`People`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `sampleBD`.`People` (
  `PeopleID` INT NOT NULL AUTO_INCREMENT ,
  `Name` VARCHAR(200) NOT NULL ,
  `EntryDate` DATETIME NULL ,
  `EntryBy` INT NULL ,
  PRIMARY KEY (`PeopleID`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `sampleBD`.`PeopleNumberId`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `sampleBD`.`PeopleNumberId` (
  `PeopleNumberIdID` INT NOT NULL AUTO_INCREMENT ,
  `PeopleID` INT NOT NULL ,
  `NumberId` INT(11) NOT NULL ,
  `EntryDate` DATETIME NULL ,
  `EntryBy` INT NULL ,
  PRIMARY KEY (`PeopleNumberIdID`) ,
  INDEX `PeopleID` (`PeopleID` ASC) ,
  INDEX `EntryBy` (`EntryBy` ASC) ,
  CONSTRAINT `PeopleID`
    FOREIGN KEY (`PeopleID` )
    REFERENCES `sampleBD`.`People` (`PeopleID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `EntryBy`
    FOREIGN KEY (`EntryBy` )
    REFERENCES `sampleBD`.`People` (`PeopleID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `sampleBD`.`PeopleCbi`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `sampleBD`.`PeopleCbi` (
  `PeopleCbiID` INT NOT NULL AUTO_INCREMENT ,
  `PeopleID` INT NOT NULL ,
  `Cbi` INT NOT NULL ,
  `EntryDate` DATETIME NULL ,
  `EntryBy` INT NULL ,
  PRIMARY KEY (`PeopleCbiID`) ,
  INDEX `PessoaID` (`PeopleID` ASC) ,
  INDEX `EntryBy` (`EntryBy` ASC) ,
  CONSTRAINT `PessoaID`
    FOREIGN KEY (`PeopleID` )
    REFERENCES `sampleBD`.`People` (`PeopleID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `EntryBy`
    FOREIGN KEY (`EntryBy` )
    REFERENCES `sampleBD`.`People` (`PeopleID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

スクリプトは 1 番目と 2 番目のテーブルを作成できますが、3 番目のテーブルに到達するとエラー コードが返されます。

Error Code: 1005. Can't create table 'samplebd.peoplecbi' (errno: 121)

これは外部キーの問題ですが、関連するテーブルの現在の構造を変更せずに修正する方法がわかりません。

助けてくれてありがとう。

4

1 に答える 1

1

これは、外部キー制約名間の名前の競合のようです。テーブル名と同様に、制約名はデータベース内で一意である必要があります。

EntryByしたがって、3 番目の表の制約に別の名前を選択してください。持っている機能には影響しません。

于 2012-04-13T17:46:08.940 に答える