Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL无法更新父表-关系数据库设计、外键约束和级联更新/删除_Php_Mysql_Foreign Keys_Relational Database - Fatal编程技术网

Php MYSQL无法更新父表-关系数据库设计、外键约束和级联更新/删除

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

我有一个非常简单的数据库设计来管理电视节目:

父表:电视节目。主键: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) 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感谢你指出语法问题。为了简洁起见,我删除了一些行,所以这不是我将要编辑的问题。那么,您是否建议将“剧集”表合并为“季节”表,然后只使用两个表?