0

少なくとも制限が少ないように見えるMyIsamと比較して、db構造を設計しようとすると、innodbは非常に煩わしいと感じます。

たとえば、単純なライブラリシステムを作成したい場合。そして私は4つのテーブルを持っています。

1、tablebook_itemは、book_name、author、publish time、および書籍に関する基本情報を記録します。

2、テーブルbook。本のアイテムの特定の実際のオブジェクトを表します。したがって、book_itemオブジェクトは多くの本オブジェクトに関連付けることができます。

tag3、本のタグを表すテーブル。科学、文学、建築などのように。

4、テーブルtag_book_item_relation。タグをbook_itemsに関連付けます。

したがって、関係は以下のとおりです。

1、私たちは予約する本アイテムがあります1対多の関係です

2、タグ付けするbook_item対多の関係です。

ここで、テーブルのエンジンはすべてinnodbであることに注意してください 。テーブルを作成しようとすると、失敗します。

Error:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'yet_another_test.book' (errno: 121)

bookただし、またはMyISAMtag_book_item_relationにエンジンを変更すると、すべてが正常になります。

したがって、テーブルにengine innodbを使用すると、何が問題になるのでしょうか。booktag_book_item_relation

SQLスクリプトはここにあります(MySQLワークベンチのフォワードエンジニアリング):

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`tag` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`book_item` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`tag_book_item_relation` (
  `book_item_id` INT NOT NULL ,
  `tag_id` INT NOT NULL ,
  PRIMARY KEY (`book_item_id`, `tag_id`) ,
  INDEX `fk_tag` (`tag_id` ASC) ,
  INDEX `fk_book_item` (`book_item_id` ASC) ,
  CONSTRAINT `fk_tag`
    FOREIGN KEY (`tag_id` )
    REFERENCES `yet_another_test`.`tag` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_book_item`
    FOREIGN KEY (`book_item_id` )
    REFERENCES `yet_another_test`.`book_item` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `yet_another_test`.`book` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `book_item_id` INT NOT NULL ,
  PRIMARY KEY (`id`, `book_item_id`) ,
  INDEX `fk_book_item` (`book_item_id` ASC) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
  CONSTRAINT `fk_book_item`
    FOREIGN KEY (`book_item_id` )
    REFERENCES `yet_another_test`.`book_item` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
4

4 に答える 4

2

book外部キー制約fk_book_itemが の制約と同じ名前を持つ「CREATE TABLE」に問題があるようtag_book_item_relationです。の制約に別の名前を使用してみてくださいbook。CREATE TABLE は正常に機能するはずです。

MyISAM には外部キーの概念がなく、FK 制約が無視されるため、これは MyISAM では問題になりません。

お役に立てれば!

于 2011-06-28T05:53:07.390 に答える
1

このエラーメッセージは、どこかに重複キーがあることを示しています。これは、外部キー制約での名前の競合が原因である可能性があります。異なるテーブルで同じ外部キー名を使用することはできません。(データベースに他のテーブルが含まれている可能性があるかどうかはわかりません。)

多くの場合、エラーは、.frmファイルがなくなっていても、InnoDBの内部ディクショナリにすでに存在するテーブルが原因で発生します。その場合、最も簡単な方法は、データのSQLダンプを実行し、データベースを削除して再作成してから、ダンプからデータをロードすることです。

于 2011-06-28T04:03:46.220 に答える
1

エラー 121 は、「外部キー制約が正しく形成されていないため、テーブルの作成に失敗しました。エラー メッセージがエラー –1 を参照している場合、テーブルに内部 InnoDB テーブルの名前と一致する列名が含まれているため、テーブルの作成に失敗した可能性があります。」と表示されます。

リンク

Index Name と Constraint Name が同じかもしれないので、変更してテーブルを作成してみてください。

于 2011-06-28T03:55:19.990 に答える
1

Foreign Key制約なしでテーブルを作成します。同じステートメントが MyISAM エンジンでも機能しますが、そこでは制約が暗黙のうちに無視されます。これが、エラーが発生しない理由です。これらの制約が本当に必要な場合は、正しく作成してください。ただし、私は通常、FK 制約を避け、アプリケーション レベルで制約を実装する傾向があります。

私がすぐに見つけた1つの問題は、DBレベルで一意でなければならない制約のシンボルであり、テーブルとテーブルの両方fk_book_itemがありますtag_book_item_relationbook

于 2011-06-28T03:55:25.683 に答える