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,尽管我们没有看到此处发布的它们引用的表。规则是:

  • 引用的列必须被索引(独立于它上面的任何其他复合索引)
  • 引用列必须具有完全相同的数据类型。

然而,这种方式会质疑您的设计。如果您在预订中附加了多个座位,那么预订的座位数量是否与剧院中的可用座位数量完全一致?这也意味着您不能拥有两个座位数相同的剧院。

您可能需要在这里重新考虑您的设计,并可能创建一个FOREIGN KEY引用theater.name而不是theater.nbrseats.

于 2013-02-15T14:32:49.833 回答