mysql - 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行。有什么办法吗?
解决方案
您的错误的直接原因是子查询返回多行。一个可能的解决方法可能是仅使用具有多行的选择作为插入数据的源。也就是说,使用一个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
。
推荐阅读
- amazon-web-services - 我应该使用 API 网关作为 S3 的代理吗?
- arrays - 为什么数组指针给我不同的值
- javascript - getjson 问题。未能加载资源
- azure - 带有专用终结点的主动故障转移的 Azure SQL 数据库连接字符串
- c++ - 如何在 C++ 代码中包含 Mariadb?
- ios - IOS可以复制超过300MB的本地文件吗?
- python - 在python中保持对象静态
- android - 如何格式化字符串以在 PDF 中打印新行 - 无法正确打印新行 - Kotlin
- java - Kubernetes 和 JVM 内存设置
- javascript - 正则表达式条件搜索 javascript