无法添加或更新子行

时间:2015-11-25 19:53:26

标签: php html mysql sql

上传照片后,我想将文件的名称和位置传递给名为pics的表格(pic_id具有filename主键属性filepath和{{ 1}})。我还想将上传的pic_id存储到users表中,因此pic_id表中的pics基本上引用了users表中的pic_id。但是我得到Error: Cannot add or update a child row: a foreign key constraint fails (db . pics, CONSTRAINT pics_ibfk_1 FOREIGN KEY (pic_id) REFERENCES users (pic_id) ON DELETE NO ACTION ON UPDATE NO ACTION)

PHP& SQL代码:

$max = "
    SELECT pic_id 
      FROM profile_pics 
     WHERE pic_id = (
           SELECT MAX(pic_id) 
             FROM profile_pics
     )
";

$sql_update = "
    UPDATE users 
       SET pic_id = '$max'
     WHERE username = '$username'
";

$sql_insert = "
    INSERT INTO profile_pics (pic_id, filename, filepath) 
    VALUES ('' ,'$fileName', '$resized_file')
";
$results_insert = $conn->query($sql_insert);
if (!$results_insert) {
    exit ("Error: " . mysqli_error($conn));
}

表用户与图片之间的关系 1

3 个答案:

答案 0 :(得分:0)

此:

$max = "SELECT pic_id FROM profile_pics WHERE pic_id = (SELECT MAX(pic_id) FROM profile_pics)";

实际上并没有在变量$max中提供结果。您必须执行查询并读取结果。

你也可以使用

SELECT MAX(pic_id) AS pic_id FROM profile_pics

答案 1 :(得分:0)

最有可能提供此信息:

  

从插入查询中删除pic_id

在此处将空值插入pic_id将失败,并带有外键约束。 NULL(在未指定字段时发生)将导致auto_increment值或NULL插入,这取决于约束可能有效。

当2个人同时执行插入时,使用当前代码也将失败:您没有使用事务来控制select max(pic_id)和后续插入。同时执行2次将导致2位用户具有相同的pic_id

答案 2 :(得分:0)

错误消息说明了一切:您不能在子表中插入值,除非父值中已存在该值。首先尝试插入profile_pics,然后更新用户。

(另外,屏幕截图中的表格名称和错误消息似乎与您的代码段中的表格名称不相符。请注意这一点。)