插入选择-超过1行

时间:2018-10-09 08:04:44

标签: mysql sql laravel

我习惯使用lstPerspectives = Perspectives.findAllByDbAndSysDelete(dbInstance, new Long(0)) ,其中所有值均取自其他表。在这种情况下,我试图复制现有的供稿。我有一个数据透视表,需要将一个供稿的值复制到新供稿。表中只有两列,但是我使用的是SQL中的一个值,因此新供稿的ID不变。

insert into select

给出此错误...

  

SQLSTATE [21000]:违反基数:1242子查询返回多于1行(SQL:INSERT INTO feed_media_permissions(feed_id,optin_media_id)VALUES(158,(SELECT forig.optin_media_id AS optin_media_id FROM feed_media_permissions as forig WHERE forig.feed_id = s) )))

每次可以复制0-4行。可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

您的错误的直接原因是子查询返回多个行。可能的解决方法是仅使用具有多行的select作为插入数据的源。也就是说,使用INSERT INTO ... SELECT构造:

INSERT INTO feed_media_permissions (feed_id, optin_media_id)
SELECT ?, forig.optin_media_id
FROM feed_media_permissions AS forig 
WHERE forig.feed_id = ?;

理想情况下,您应该在此处使用PHP准备好的语句。与第一个占位符绑定$feed->id,与第二个占位符绑定$existing_feed_id

答案 1 :(得分:1)

您的$feed->id应该在子查询中,以确保它在返回的每一行中。

DB::statement('INSERT INTO feed_media_permissions 
    (feed_id, optin_media_id)
    VALUES 
    (SELECT '. $feed->id .' as feed_id, forig.optin_media_id AS optin_media_id
    FROM feed_media_permissions as forig 
    WHERE forig.feed_id = ' . $existing_feed_id . ')
');

您还应该使用绑定来防止sql注入:

DB::statement('INSERT INTO feed_media_permissions 
    (feed_id, optin_media_id)
    VALUES 
    (SELECT ? as feed_id, forig.optin_media_id AS optin_media_id
    FROM feed_media_permissions as forig 
    WHERE forig.feed_id = ?)
', [$feed->id, $existing_feed_id]);