Php SQL:如果XY不存在
我安装了WordPress。我有1000多个帖子,有自定义字段。问题是,Wordpress仅在您第一次保存帖子时才在数据库中创建自定义字段,但我想填充这些字段,无论它们是否存在,当它们不存在时,我需要创建它们 我试过这个,当然,它是有效的: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
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是的,我看到了。谢谢我调整了我的答案。事实上,这在一个查询中是可能的。检查我的答案。虽然有点神秘