php - 了解 InnoDB 外键

标签 php mysql sql innodb

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

DB Schema

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

#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、名字、姓氏、国籍、出生日期、其他信息 表movie: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;

最佳答案

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

它存储电影和艺术家之间的链接。由于一部电影可以有许多 艺术家,而一个艺术家可以出现在许多 电影中,因此您需要一个单独的表来存储所有这些关系。 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/

相关文章:

php - Symfony2中用于开发和生产的不同错误模板

php - 在 Woocommerce 3.3 中设置某些产品类别或产品 ID 的最小数量

php - 创建字体预览

php - 否则如果不在 php 中工作

php - codeigniter 搜索框并保存数据

sql - 如何在 SQL Server 2012 中搜索数据库中所有表中的列名?

sql - 我应该如何处理一对多关系数据库模式中的数据更新?

PHP 组合数组

MYSQL,需要所有日期和第一个日期的列表

sql - 具有跟踪考试类型能力的类(class)考试场景的数据库设计