2

MySQL Workbench を使用してデータベースを設計し、SQL CREATE スクリプトをエクスポートします。しかし、このスクリプトを実行してデータベースを作成すると、エラー - errno: 121 が表示されます。

両方の制約が同じキーを使用するため、MySQL Workbench は 2 つの制約に同じ名前を付けていることがわかります (主キー「roleID」を持つテーブルがあり、他の 2 つのテーブルでこのキーを参照しています)。

デザイナーで制約の名前を直接変更する方法はありますか? SQL CREATE スクリプトをフォワード エンジニアリングすると、エラーは発生しませんか?

デザイナーでリレーションをダブルクリックして新しいキャプションを付けようとしましたが、それでも元の名前でスクリプトが生成されます。

エラーを作成する生成されたスクリプトの一部:


CREATE  TABLE IF NOT EXISTS users.roles (
  roleID INT NOT NULL AUTO_INCREMENT ,
  ...
  PRIMARY KEY (roleID) ,
  ...);

CREATE TABLE IF NOT EXISTS users.userRoles ( ... roleID INT NOT NULL , ... CONSTRAINT roleID FOREIGN KEY (roleID ) REFERENCES users.roles (roleID ));

CREATE TABLE IF NOT EXISTS users.resourcePrivileges ( roleID INT NOT NULL , ... CONSTRAINT roleID FOREIGN KEY (roleID ) REFERENCES users.roles (roleID ));

4

3 に答える 3

2

どうやってそれで終わったのかわからない。MySQL WorkBench を試してみて、FK を使用して 2 つのテーブルを作成したところ、

-- -----------------------------------------------------
-- Table `mydb`.`users`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`users` (
  `idusers` INT NULL ,
  PRIMARY KEY (`idusers`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`usersRoles`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`usersRoles` (
  `users_idusers` INT NOT NULL ,
  PRIMARY KEY (`users_idusers`) ,
  CONSTRAINT `fk_usersRoles_users`
    FOREIGN KEY (`users_idusers` )
    REFERENCES `mydb`.`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

制約には一意の名前「fk_usersRoles_users」があることに注意してください。これは、テーブル名を使用するため重複しません。楽しみのために、同じテーブル間に別の関係を追加しました。デフォルトでは、

-- -----------------------------------------------------
-- Table `mydb`.`usersRoles`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`usersRoles` (
  `users_idusers` INT NOT NULL ,
  `users_idusers1` INT NOT NULL ,
  PRIMARY KEY (`users_idusers`, `users_idusers1`) ,
  INDEX `fk_usersRoles_users1` (`users_idusers1` ASC) ,
  CONSTRAINT `fk_usersRoles_users`
    FOREIGN KEY (`users_idusers` )
    REFERENCES `mydb`.`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_usersRoles_users1`
    FOREIGN KEY (`users_idusers1` )
    REFERENCES `mydb`.`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

これも問題ではありません(上記はすべて自動生成されます-テーブル名、参照テーブルの主キーのみを設定し、2つの1:N関係を追加しました)

注: バージョン 5.2.30。

編集 あなたの好みで何かが起こったのかもしれません。fk 制約のデフォルト名はモデルタブで定義されます。

于 2010-12-02T09:17:58.960 に答える
0

エラー 121 は、制約名の重複によるものです。ソリューション例 通常、MYSQL フォワード エンジニアリング エクスポート オプションを使用して SQL スクリプトを生成する場合、問題を解決するには、「外部キー名」が SQL スクリプト/スキーマで一意であることを確認する必要があります。

于 2015-10-21T13:29:03.177 に答える
-1

外部キーに制約を設定すると、一部のテーブルの同じ主キーを参照する別の名前が割り当てられません。したがって、重複がある場合は、生成されたすべてのスクリプトですべてのインデックス名を確認してください。別の名前に変更します。その後、続行できます...

于 2010-12-02T08:37:02.417 に答える