繁体   English   中英

了解InnoDB外键

[英]Understanding InnoDB foreign keys

我正在关注一个PHP和MySQL教程。 此时,我必须创建一个看起来像这样的数据库:

DB Schema

我手动创建了数据库,但我不明白roll表的重点。 例如,假设我要添加一部电影:我怎么做,因为我不被允许? 示例错误:

#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,title,image,category,description, artistId

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

到目前为止我有DB模式:

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;

使用这些约束,除非艺术家电影都存在,否则您将无法定义角色

movieCode上的外键应该在roll表上。 MovieCode是影片表的主键。

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

给定的错误消息

#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)

意味着你在电影上有一个外键约束,它引用了roll(role)表。

这将具有只能输入角色(滚动条目)存在的电影的语义。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM