我目前正在尝试在MySQL数据库中存储一些数据。这是我第一次使用数据库,我越来越
“错误:INSERT INTO capitulos(id_hiperlivro,ticulo,ordem)值('1','vamola','0')无法添加或更新子行:外键约束失败(hiperlivro
。capitulos
,CONSTRAINT capitulos_ibfk_2
外键(id_pai
)参考capitulos
(id
))”。
是我的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
中没有具有相同值的对应记录。