我有一个WordPress安装。我有超过1000个帖子,有自定义字段。问题是,Wordpress仅在您第一次保存帖子时才在数据库中创建自定义字段,但我想填写这些字段,无论它们是否存在,当它们不存在时,我需要创建它们。
我试过这个,当然,它的工作:
UPDATE wp_postmeta
SET meta_value = '9.979348999999957'
WHERE meta_key ='longitude' AND post_id = '486';
这是一个问题:如果数据库中不存在meta_key'经度',我该怎么办?
答案 0 :(得分:0)
如果你想检查'经度'的存在
try this: $sql = mysql_num_rows(mysql_query("Select * from wp_postmeta
WHERE meta_key ='longitude'");
echo $sql;
这将告诉您具有该meta_key的记录是否存在于数据库中
答案 1 :(得分:0)
INSERT INTO wp_postmeta(post_id, meta_key, meta_value)
VALUES (486, 'longitude', '9.979348999999957')
ON DUPLICATE KEY UPDATE meta_value = '9.979348999999957';
假设wp_postmeta
的主键是(post_id, meta_key
)。
我see now但事实并非如此。在这种情况下,您可以先插入然后再更新。
-- insert first
INSERT INTO wp_postmeta(post_id, metakey)
SELECT DISTINCT p.id, 'longitude'
FROM wp_posts p
LEFT JOIN wp_postmeta m ON (p.id = m.post_id AND m.meta_key = 'longitude')
WHERE m.post_id IS NULL;
-- update later
UPDATE wp_postmeta
SET meta_value = '9.979348999999957'
WHERE meta_key = 'longitude' AND post_id = '486';
答案 2 :(得分:0)
好的,如果没有post_id
和meta_key
组合的唯一索引,这甚至是可能的:
INSERT
INTO
wp_postmeta
(meta_id, post_id, meta_key, meta_value)
(SELECT
wm.meta_id, nd.post_id, "longitude", nd.new_longitude
FROM
(SELECT
456 as post_id, "new cool longitude here" as new_longitude) nd
LEFT JOIN
wp_postmeta wm ON nd.post_id = wm.post_id AND wm.meta_key =
"longitude")
ON DUPLICATE KEY UPDATE meta_value = VALUES(meta_value)
要更改值,只需将此查询中的456和“经度”更新为您的值。
INSERT ... ON DUPLICATE KEY UPDATE ...
允许执行新行的插入或更新现有的。有关此查询形式的更多信息,请参阅MySQL manual。
由于post_id
上缺少唯一索引,meta_key
组合,唯一唯一的索引是meta_id
。因此,我们的想法是使用meta_id
作为重复索引。我们来看看选择查询:
SELECT
wm.meta_id, nd.post_id, "location", nd.new_location
FROM
(SELECT 456 as post_id, "new cool location here" as new_location) nd
LEFT JOIN
wp_postmeta wm ON nd.post_id = wm.post_id AND wm.meta_key =
"location"
此查询的要点是查找行meta_id
的现有主索引,或者如果找不到任何内容则使用NULL
。
如果DB中存在数据,则结果示例:
+---------+---------+-----------+------------------------+
| meta_id | post_id | longitude | new_longitude |
+---------+---------+-----------+------------------------+
| 4 | 456 | longitude | new cool location here |
+---------+---------+-----------+------------------------+
1 row in set (0.00 sec)
如果没有:
+---------+---------+-----------+------------------------+
| meta_id | post_id | longitude | new_longitude |
+---------+---------+-----------+------------------------+
| NULL | 456 | longitude | new cool location here |
+---------+---------+-----------+------------------------+
1 row in set (0.00 sec)
不要对此查询的复杂性感到困惑:此查询的性能与select + update组合相同。
警告此类查询会丢失数据库之间的可移植性。 INSERT ... ON DUPLICATE KEY UPDATE ...
是SQL标准的MySQL扩展,仅受MySQL支持