Php MYSQL无法更新父表-关系数据库设计、外键约束和级联更新/删除
我有一个非常简单的数据库设计来管理电视节目: 父表:电视节目。主键:show_id 儿童表:季节。主键:季节id,外键:显示id 儿童表:剧集。主键:插曲id,外键:季节id 表创建SQL:Php MYSQL无法更新父表-关系数据库设计、外键约束和级联更新/删除,php,mysql,foreign-keys,relational-database,Php,Mysql,Foreign Keys,Relational Database,我有一个非常简单的数据库设计来管理电视节目: 父表:电视节目。主键:show_id 儿童表:季节。主键:季节id,外键:显示id 儿童表:剧集。主键:插曲id,外键:季节id 表创建SQL: $sql = "DROP TABLE IF EXISTS ".$table_shows."; CREATE TABLE $table_shows ( show_id int(11) NOT NULL, name varchar(120) DE
$sql = "DROP TABLE IF EXISTS ".$table_shows.";
CREATE TABLE $table_shows (
show_id int(11) NOT NULL,
name varchar(120) DEFAULT NULL,
PRIMARY KEY (show_id),
UNIQUE KEY show_id_UNIQUE (show_id)
) $charset_collate;
DROP TABLE IF EXISTS ".$table_seasons.";
CREATE TABLE $table_seasons (
season_id int(10) NOT NULL,
show_id int(11) DEFAULT NULL,
name varchar(120) DEFAULT NULL,
PRIMARY KEY (season_id),
KEY seasons_ibfk_1 (show_id),
CONSTRAINT seasons_ibfk_1 FOREIGN KEY (show_id) REFERENCES $table_shows (show_id) ON DELETE CASCADE ON UPDATE CASCADE
) $charset_collate;
DROP TABLE IF EXISTS ".$table_episodes.";
CREATE TABLE $table_episodes (
episode_id int(10) NOT NULL,
season_id int(10) DEFAULT NULL,
name varchar(120) DEFAULT NULL,
PRIMARY KEY (episode_id),
KEY season_id (season_id),
CONSTRAINT episodes_ibfk_1 FOREIGN KEY (season_id) REFERENCES $table_seasons (season_id)
) $charset_collate;";
我想做的是,如果一个节目被从tv_shows表中删除,那么删除会级联,因此季节和剧集也会从各自的表中删除
我可以很好地插入这些表格。但如果我尝试从tv_shows表中删除一行,则会出现SQL错误:
错误1451:1451:无法删除或更新父行:外键约束失败
那么,我的FK约束哪里出了问题?您还需要将ON-DELETE级联添加到剧集中。这样可以确保它们都互相跟随进入垃圾箱
CONSTRAINT episodes_ibfk_1
FOREIGN KEY (season_id)
REFERENCES $table_seasons (season_id)
ON DELETE CASCADE
我认为on delete cascade是自上而下工作的,因此从节目中删除会删除季节,然后会抛出一个错误,因为剧集是孤立的。请尝试向剧集约束添加on delete SET NULL cascade,因为seasure_id为nullable3语法错误在您的create语句中都是相同的逗号,在所有情况下,名称varchar120 DEFAULT NULL后缺少。我也不相信你的设计,大概每个节目都有一个季节,每个节目/季节中都有很多插曲,因此table_插曲对我来说似乎是一种规范化。@P.Salmon感谢你指出语法问题。为了简洁起见,我删除了一些行,所以这不是我将要编辑的问题。那么,您是否建议将“剧集”表合并为“季节”表,然后只使用两个表?