我正在关注一个PHP& MySQL教程。此时,我必须创建一个如下所示的数据库:
我手动创建了数据库,但我不明白roll table的重点。例如,假设我要添加一部电影:我怎么做,因为我不被允许?示例错误:
#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;
答案 0 :(得分:8)
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;
使用这些限制,除非艺术家和电影都存在,否则您将无法定义角色。
答案 1 :(得分:0)
movieCode上的外键应该在roll表上。 MovieCode是影片表的主键。
答案 2 :(得分:0)
在您给出的示例中,您必须从roll(role)表生成外键约束到其他表(movie,artist),而不是相反。
给出的错误消息
#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)中输入有效的艺术家 - 电影对的条目。