6

我正在关注一个 PHP 和 MySQL 教程。此时,我必须创建一个如下所示的数据库:

数据库架构

我手动创建了数据库,但我不明白滚动表的意义。例如,假设我想添加一部电影:既然不允许,我该怎么做?示例错误:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`movie`, CONSTRAINT `movie_ibfk_1` FOREIGN KEY (`movieCode`) REFERENCES `roll` (`movieCode`) ON DELETE CASCADE) 

我个人会做类似的事情:

表艺术家:artistId , firstname, lastname, nationality, dateOfBirth, otherInfo 表电影:movieCode, title, image, category, description, artistId

作为相关外键的粗体。但是,我不明白在那里使用卷表的概念。有人可以为我澄清这一点,因为我想像教程假装教的那样做吗?

到目前为止我拥有的数据库架构:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

CREATE TABLE IF NOT EXISTS `artist` (
  `artistId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `firstName` char(30) NOT NULL,
  `lastName` char(30) NOT NULL,
  `dateOfBirth` date NOT NULL,
  `nationality` char(30) NOT NULL,
  `otherInfo` text NOT NULL,
  PRIMARY KEY (`artistId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `movie` (
  `movieCode` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `title` char(30) NOT NULL,
  `image` varchar(50) NOT NULL,
  `category` char(50) NOT NULL,
  `movieDesc` text NOT NULL,
  PRIMARY KEY (`movieCode`),
  UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


CREATE TABLE IF NOT EXISTS `roll` (
  `movieCode` int(10) unsigned NOT NULL,
  `artistId` int(10) unsigned NOT NULL,
  PRIMARY KEY (`movieCode`,`artistId`),
  KEY `artistId` (`artistId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `user` (
  `userId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `firstName` char(30) NOT NULL,
  `lastName` char(30) NOT NULL,
  `username` char(30) NOT NULL,
  `password` char(20) NOT NULL,
  `usertype` int(1) unsigned NOT NULL,
  PRIMARY KEY (`userId`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;



ALTER TABLE `movie`
  ADD CONSTRAINT `movie_ibfk_1` FOREIGN KEY (`movieCode`) REFERENCES `roll` (`movieCode`) ON DELETE CASCADE;

ALTER TABLE `roll`
  ADD CONSTRAINT `roll_ibfk_1` FOREIGN KEY (`artistId`) REFERENCES `artist` (`artistId`) ON DELETE CASCADE;
4

3 回答 3

8

roll表(可能应该称为角色表)是所谓的多对多关系。

它存储电影和艺术家之间的链接。由于一部电影可以有许多艺术家,并且一个艺术家可以出现在许多电影中,因此您需要一个单独的表来存储所有这些关系。中的每一行roll代表出现在电影中的艺术家。

为避免任何约束错误,您需要先在数据库中插入电影和艺术家,然后在表中插入一行roll来定义该电影中出现的艺术家。因此,该roll表需要两个外键约束;桌子上的一个artist,你有:

ALTER TABLE `roll`
  ADD CONSTRAINT `roll_ibfk_1` FOREIGN KEY (`artistId`) REFERENCES `artist` (`artistId`) ON DELETE CASCADE;

还有一个在movie桌子上:

ALTER TABLE `roll`
  ADD CONSTRAINT `roll_ibfk_2` FOREIGN KEY (`movieCode`) REFERENCES `movie` (`movieCode`) ON DELETE CASCADE;

有了这些约束,您将无法定义角色,除非该艺术家电影都存在。

于 2013-09-23T21:48:57.193 回答
0

您在 movieCode 上的外键应该在卷表上。MovieCode 是电影表的主键。

于 2013-09-23T21:51:26.040 回答
0

在您给定的示例中,您必须生成从滚动(角色)表到其他表(电影、艺术家)的外键约束,而不是相反。

给定的错误信息

#1452 - Cannot add or update a child row: a foreign key constraint fails (`test`.`movie`, CONSTRAINT `movie_ibfk_1` FOREIGN KEY (`movieCode`) REFERENCES `roll` (`movieCode`) ON DELETE CASCADE)

意味着您对电影有一个外键约束,它引用了滚动(角色)表。

这将具有这样的语义,即只能输入存在角色(卷中的条目)的电影。

但我想语义应该是您只能为现有电影和现有艺术家添加角色。因此,卷(角色)表应该在其他表上有外键,然后您可以添加艺术家和电影,然后在卷(角色)中输入有效的艺术家-电影对的条目。

于 2013-09-23T21:58:31.617 回答