我目前正在尝试在MySQL数据库中存储一些数据。这是我第一次使用数据库,我越来越


  “错误:INSERT INTO capitulos(id_hiperlivro,ticulo,ordem)值('1','vamola','0')无法添加或更新子行:外键约束失败(hiperlivrocapitulos,CONSTRAINT capitulos_ibfk_2外键(id_pai)参考capitulosid))”。


是我的PHP代码错误还是我的SQL代码?

SQL表:

    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";

    -- Table structure for table capitulos

    CREATE TABLE IF NOT EXISTS capitulos (
    id int(11) NOT NULL AUTO_INCREMENT,
    id_pai int(11) NOT NULL,
    id_hiperlivro int(11) NOT NULL,
    titulo varchar(255) COLLATE utf16_bin NOT NULL,
    ordem int(11) NOT NULL,
    PRIMARY KEY (id),
    KEY id_hiperlivro (id_hiperlivro),
    KEY id_pai (id_pai)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf16 COLLATE=utf16_bin AUTO_INCREMENT=1         ;

    -- --------------------------------------------------------
    -- Table structure for table hiperlivros
    --

     CREATE TABLE IF NOT EXISTS hiperlivros (
     id int(11) NOT NULL AUTO_INCREMENT,
     titulo varchar(255) COLLATE utf16_bin NOT NULL,
     data_criacao datetime NOT NULL,
     data_edicao datetime NOT NULL,
     PRIMARY KEY (id)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf16 COLLATE=utf16_bin      AUTO_INCREMENT=1 ;

     ---------------------------------------------------


    -- Table structure for table paginas
    --

    CREATE TABLE IF NOT EXISTS paginas (
    id int(11) NOT NULL AUTO_INCREMENT,
    id_capitulo int(11) NOT NULL,
    texto text COLLATE utf16_bin NOT NULL,
    ordem int(11) NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY id_capitulo (id_capitulo)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf16 COLLATE=utf16_bin AUTO_INCREMENT=1 ;


    -- Constraints for table capitulos
    --
    ALTER TABLE capitulos
    ADD CONSTRAINT capitulos_ibfk_2 FOREIGN KEY (id_pai) REFERENCES       capitulos (id),
    ADD CONSTRAINT capitulos_ibfk_1 FOREIGN KEY (id_hiperlivro) REFERENCES hiperlivros (id);

    --
    -- Constraints for table paginas
    --
    ALTER TABLE paginas
    ADD CONSTRAINT paginas_ibfk_1 FOREIGN KEY (id_capitulo) REFERENCES  capitulos (id);


PHP代码:

   <?php


    $ordem = 0;

    $colocados = array();
    $ids = array();

    foreach ($data["conteudo"] as $modulo) {

        $title = $modulo["title"];
        $tipo = $modulo["tipo"];
        $pags = $modulo["pag"];


        $colocados[$ordem] = $tipo;

        if ($colocados[$ordem] == 'box'){

            $sql = "INSERT INTO capitulos (id_hiperlivro, titulo, ordem)
            VALUES ('$id_hiperlivro', '$title', '$ordem')";
        }

        else if($colocados[$ordem] == 'medbox'){
            $i=0;

            while($colocados[$i] != 'box'){
                $i++;
            }

            $id_pai = ids[$i];

            $sql = "INSERT INTO capitulos (id_pai, id_hiperlivro, titulo, ordem)
            VALUES ('$id_pai','$id_hiperlivro','$title','$ordem')";
        }

        else if($colocados[$ordem] == 'minibox'){
            $i=0;

            while($colocados[$i] != 'medbox'){
                $i++;
            }

            $id_pai = ids[$i];

            $sql = "INSERT INTO capitulos (id_pai, id_hiperlivro, titulo, ordem)
            VALUES ('$id_pai','$id_hiperlivro','$title','$ordem')";
        }

        $conn = new mysqli($servername, $username, $password, $dbname);
        // Check connection
        if ($conn->connect_error) {
            die("Connection failed: " . $conn->connect_error);
        }

        if ($conn->query($sql) === TRUE) {
            echo "New record created successfully";
             $ids[$ordem] = $conn->insert_id;
        }

        else {
            echo "Error: " . $sql . "<br>" . $conn->error;
        }

        $conn->close();

        $ordem++;
    }


    }

    ?>


预先感谢您,并为大帖子感到抱歉:(

最佳答案

这是你的问题:

ADD CONSTRAINT capitulos_ibfk_2 FOREIGN KEY (id_pai) REFERENCES       capitulos (id)


此约束意味着,对于具有id_pai = X的capitulos中的每个记录,在同一具有captionlos的表中还必须存在具有id = X的记录。

显然,您要插入定义了id_pai的记录,但是在字段id中没有具有相同值的对应记录。

10-08 12:38