MySQL使用select和join插入post_meta - 我做错了什么?

时间:2018-05-24 23:05:41

标签: mysql phpmyadmin

所以,我试图运行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

基本上,我需要使用帖子ID,元组密钥(attached_image)和meta_value更新wp4t_postmeta表。

当wp4t_postmeta中meta_key _content_field_42的meta_value与wp4t_posts的guid匹配时,我需要meta_value来自wp4t_posts ID。

每当我试图运行它时,我的tmp目录中的大小都没有了,所以我添加了一个限制来测试它:

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 - 重复输入' 0'关键' PRIMARY'"

我知道这是来自wp4t_postmeta的meta_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"

2 个答案:

答案 0 :(得分:1)

我要花一点时间来回答这个问题。

我的查询是正确的。

我根本没有启用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"
-----------------------------------------------------------------

在wp_postmeta中使用超过1MM表的VPS服务器上工作 - 花了一些时间,但它已经运行了。

答案 1 :(得分:0)

ON a.meta_value是" true"只要a.meta_value非空。这可能不是你想要的。也许这个:

ON b.id = a.post_id

如果这还不够,请查看ab的几个相关行。

进一步说明:当ON子句总是"为真"时,您正在构建一个临时表,该所有组合a和{ {1}}。如果每行有10K行,那么这将是一个包含100M行的临时表。这可能会溢出tmp目录中的空间。

但是,如果过了那个,你可能会得到相同的b

的10K行

但即使这样也无法解释一切。如果我没有弄错的话,a.post_idpost_id,通常不包含AUTO_INCREMENT。获得0的唯一可能方法是明确插入0

但这就是你在做什么。

好的,我无法推断原始0的来源,但这可能是另一个问题的线索。