首页 > 解决方案 > INSERT INTO SELECT - 超过 1 行

问题描述

我习惯于insert into select所有值都取自其他表。在这种情况下,我试图复制现有的提要。我有一个数据透视表,需要将一个提要的值复制到新的提要。表中只有两列,但我使用的是 SQL 中的一个值,并且新提要的 id 没有改变。

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

给出这个错误...

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 = 156)))

每次可以复制0-4行。有什么办法吗?

标签: mysqlsqllaravel

解决方案


您的错误的直接原因是子查询返回多行。一个可能的解决方法可能是仅使用具有多行的选择作为插入数据的源。也就是说,使用一个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


推荐阅读