Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL:如果XY不存在_Php_Mysql_Sql_Wordpress - Fatal编程技术网

Php SQL:如果XY不存在

Php SQL:如果XY不存在,php,mysql,sql,wordpress,Php,Mysql,Sql,Wordpress,我安装了WordPress。我有1000多个帖子,有自定义字段。问题是,Wordpress仅在您第一次保存帖子时才在数据库中创建自定义字段,但我想填充这些字段,无论它们是否存在,当它们不存在时,我需要创建它们 我试过这个,当然,它是有效的: UPDATE wp_postmeta SET meta_value = '9.979348999999957' WHERE meta_key ='longitude' AND post_id = '486'; 问题是:如果数据库中不存在meta_键“lo

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

我试过这个,当然,它是有效的:

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

问题是:如果数据库中不存在meta_键“longitude”,我该怎么办?

如果要检查是否存在“longitude”

try this: $sql = mysql_num_rows(mysql_query("Select * from wp_postmeta 
WHERE meta_key ='longitude'");

echo $sql;
这将让您知道数据库中是否存在具有该meta_键的记录

INSERT INTO wp_postmeta(post_id, meta_key, meta_value)
VALUES (486, 'longitude', '9.979348999999957')
ON DUPLICATE KEY UPDATE meta_value = '9.979348999999957';
假设
wp\u postmeta
的主键是
(post\u id,meta\u key


我想不是。在这种情况下,可以先插入,然后更新

-- 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';

好的,如果没有
post\u id
meta\u 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和“经度”更新为您的值

这个查询是如何工作的?
插入。。。在重复键更新时…
允许执行新行插入或更新现有行(如果存在唯一/主索引的重复)。有关此查询形式的更多信息,请参见

由于在
post\u id
meta\u key
组合上缺少唯一索引,因此剩下的唯一唯一索引是
meta\u 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
。 如果数据库中存在现有数据,结果示例:

  +---------+---------+-----------+------------------------+
  | 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)
不要对该查询的复杂性感到困惑:该查询的性能与选择+更新组合相同


警告这种查询在数据库之间失去了可移植性<代码>插入。。。在重复密钥更新中…是SQL标准的MySQL扩展,并且仅由MySQL支持吗?

您可以先进行选择,看看它是否存在吗?如果没有,就创建它。动态创建表字段是不好的做法……根据表描述,
post\u id
meta\u key
字段的组合没有唯一的索引。如果有,您可以简单地使用
INSERT。。。在重复密钥更新时
。您准备好更改数据库了吗?将不起作用,因为这些字段上没有唯一的索引。检查description@mente是的,我看到了。谢谢我调整了我的答案。事实上,这在一个查询中是可能的。检查我的答案。虽然有点神秘