SQL:如果WHERE XY不存在

时间:2013-12-04 11:35:17

标签: php mysql sql wordpress

我有一个WordPress安装。我有超过1000个帖子,有自定义字段。问题是,Wordpress仅在您第一次保存帖子时才在数据库中创建自定义字段,但我想填写这些字段,无论它们是否存在,当它们不存在时,我需要创建它们。

我试过这个,当然,它的工作:

UPDATE wp_postmeta 
SET meta_value = '9.979348999999957'
WHERE meta_key ='longitude' AND post_id = '486';

这是一个问题:如果数据库中不存在meta_key'经度',我该怎么办?

3 个答案:

答案 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_idmeta_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支持