我做错了什么?

2vuwiymt  于 2021-06-23  发布在  Mysql
关注(0)|答案(2)|浏览(340)

所以,我尝试运行一个sql操作:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT a.post_id, '_attached_image', b.ID
FROM wp4t_postmeta a 
INNER JOIN wp4t_posts b ON a.meta_value WHERE a.meta_key="_content_field_42" 
= b.guid

本质上,我需要用post id、meta key(附加的\图像)和meta \ u值更新wp4t \ u postteta表。
当wp4t\u postemta中meta\u key\u content\u字段\u 42的meta\u值与wp4t\u posts的guid匹配时,我需要meta\u值来自wp4t\u posts id。
一开始,每次尝试运行tmp dir时,它的大小都会用尽,所以我添加了一个限制来测试它:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT a.post_id, '_attached_image', b.ID
FROM wp4t_postmeta a 
INNER JOIN wp4t_posts b ON a.meta_value WHERE a.meta_key="_content_field_42" 
= b.guid LIMIT 10;

现在我得到错误“#1062-键'primary'的重复条目'0'”
我知道这是wp4t\u postemta的meta\u id自动递增表,但是我想如果不包括它,它会自动递增吗?
我做错什么了?
另外,有没有更好的方法来编写这个查询?
更新。。。。正在取得进展:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid  
WHERE postmeta.meta_key="_content_field_42"
AND posts.post_type="attachment"

编辑。。。。仍然活着:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID 
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid 
AND postmeta.meta_key = '_content_field_42' 
WHERE posts.post_type="attachment"
92dk7w1h

92dk7w1h1#

ON a.meta_value 是“真的”吗 a.meta_value 为非空。那可能不是你想要的。也许是这样的:

ON b.id = a.post_id

如果这还不够,我们来看看这两种方法的相关行 a 以及 b .
进一步解释:当 ON 子句总是“true”,您正在构建一个临时表,它是所有 a 以及 b . 如果每个表都有10k行,那就是一个有100m行的临时表。这可能会使tmp目录中的空间溢出。
但是,如果你过了这一关,你可能会有10万排同样的人 a.post_id 但即使这样也不能解释一切。如果我没弄错的话, post_id 是一个 AUTO_INCREMENT ,通常不包含 0 . 唯一可能的办法 0 是显式插入 0 .
但这就是你要做的。
好吧,我无法推断 0 但这很可能是另一个问题的线索。

cidc1ykv

cidc1ykv2#

我要花点时间来回答这个问题。
我的问题是正确的。
我只是没有打开autoincrement,因为有一个无效的id 0,我删除了它。
编辑:最终正确查询

-----------------------------------------------------------------
INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID 
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid 
WHERE postmeta.meta_key = '_content_field_42' 
AND posts.post_type="attachment"
-----------------------------------------------------------------

在一个vps服务器上工作,在wp\ U postmeta中有超过1毫米的表-花了一些时间,但它运行了。

相关问题