我习惯使用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行。可以解决这个问题吗?
答案 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]);