2

nbrseats を使用して外部キーを作成しようとしていますが、常にエラー 1005 が発生します。誰か助けてくれませんか!?

create table theater (
    name varchar(30) primary key,
    nbrseats int not null
) ENGINE=INNODB;

create table reservation (
    nbr integer auto_increment,
    users_username varchar(30),
    cinemashow_showdate date,
    movies varchar(30),
    nbrseats int not null,
    primary key (nbr),
    foreign key (nbrseats) references theater(nbrseats),
    foreign key (users_username) REFERENCES users(username)
        on delete cascade,
    foreign key (cinemashow_showdate, movies) references cinemashow(showdate, movie_title)
       on delete cascade
) ENGINE=INNODB;
4

1 に答える 1

1

別のテーブルの になるにFOREIGN KEYは、 にインデックスを作成する必要がありますtheater.nbrseats。したがって、特定の行を確実に参照できるようにするには、それをUNIQUEインデックスにする必要があります。そうしないと、重複する値がある場合、参照テーブルは参照する行を識別できなくなります。InnoDB では、一意でないインデックスでリレーションシップを作成できますが、探している動作ではない可能性があります。

そのビットの詳細については、この質問を参照してください。

create table theater (
  name varchar(30) primary key,
  nbrseats int not null,
  UNIQUE INDEX `idx_nbrseats` (nbrseats)
) ENGINE=INNODB;

FOREIGN KEYテーブル内の他の定義についても同じことが言えますがreservation、参照されているテーブルはここに掲載されていません。ルールは次のとおりです。

  • 参照される列にはインデックスを付ける必要があります (その列の他の複合インデックスとは無関係)
  • 参照する列は、まったく同じデータ型である必要があります。

ただし、この種の呼び出しは設計に疑問を投げかけます。座席数を指定して予約する場合、予約した座席数は劇場の空席数と正確に一致しますか? また、同じ座席数の劇場を 2 つ持つことはできません。

ここで設計を再検討する必要がある場合があり、おそらく の代わりにFOREIGN KEY参照する を作成します。theater.nametheater.nbrseats

于 2013-02-15T14:32:49.833 に答える