2015-11-25 50 views
0

上传照片后,我想将文件的名称和位置传递到名为pics(其中pic_id主键属性为filenamefilepath)的表中。我还希望将pic_id上传到用户表中,因此表中的pic_id基本上在用户表中引用了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)"; 

实际上不会给你的变量$max结果:用户和图片 1

回答

0

这间

$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)); 
} 

表关系。您必须执行查询并阅读结果。

你也可以只使用

SELECT MAX(pic_id) AS pic_id FROM profile_pics 
0

最有可能与这样的信息:

从插入查询中删除pic_id

在这里插入一个空的pic_id将会失败,并带有外键约束。一个NULL(当未指定该字段时会发生)将导致auto_increment值或NULL插入,这取决于约束可能会起作用。

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

+0

我如何可以插入在归因于用户pic_id以前的更新声明? –

+0

如果你先执行'$ sql_insert',mysql可以返回'last_insert_id',从而不需要'max'查询。使用例如'$ last_id = mysql_insert_id();'获得一个自动递增的最后一个递增值。 –

0

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

(同样,在你的屏幕截图和错误信息表名称似乎不匹配在您的代码段。请注意这一点。)

+0

是的,我拿出了一些与此代码相关的属性,以便更容易理解。这就是说我想给图片中的pic_id与用户中的pic_id相同的值,你知道我该怎么做吗? –

+0

'pic_id'是'pic'中的主键。使该列成为自动增量列,并让dbms为您生成值,然后使用“SELECT LAST_INSERT_ID()”检索该值并将该值插入到用户中。 –

相关问题