我正在关注一个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 ,名字,姓氏,国籍,dateOfBirth,otherInfo
影片列表:movieCode,标题,图像,类别,描述, 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;

最佳答案

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;

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

关于php - 了解InnoDB外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18969438/

10-13 02:47