所以,我试图运行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"
答案 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
如果这还不够,请查看a
和b
的几个相关行。
进一步说明:当ON
子句总是"为真"时,您正在构建一个临时表,该所有组合a
和{ {1}}。如果每行有10K行,那么这将是一个包含100M行的临时表。这可能会溢出tmp目录中的空间。
但是,如果过了那个,你可能会得到相同的b
但即使这样也无法解释一切。如果我没有弄错的话,a.post_id
是post_id
,通常不包含AUTO_INCREMENT
。获得0
的唯一可能方法是明确插入0
。
但这就是你在做什么。
好的,我无法推断原始0
的来源,但这可能是另一个问题的线索。