![](/img/trans.png)
[英]Check if a record with the same unique ID exists in SQL table before insert
[英]SQL check if non-unique record exists—If it does, UPDATE; if not, INSERT the record INTO the table
这似乎是一个常见的场景,但我似乎找不到任何东西。
我正在尝试在 wp_postmeta 表上复制 WordPress 数据库中的一些记录,并更改副本上的meta_key
值。
但是,某些具有meta_key
值的行已经存在空白meta_value
字段。 因此,在复制时,我想检查具有给定post_id
和meta_key
值的记录是否存在,如果存在,则更新它; 如果没有,则将记录插入表中。
由于它是 wp_postmeta 表,因此许多记录可能具有非唯一的post_id
和meta_key
值,因此我对 ON DUPLICATE KEY UPDATE 没有运气。
这是我尝试过的:
INSERT INTO wp_postmeta(post_id, meta_key, meta_value)
SELECT o.post_id, '_new_column_name', o.meta_value
FROM wp_postmeta o
WHERE o.meta_key = '_old_column_name'
AND NOT EXISTS (
SELECT * FROM wp_postmeta WHERE post_id = o.post_id AND meta_key = o.meta_key
);
此查询返回 0 个结果。
我不想简单地重命名列,因为我想将这些记录与数据库中的旧列名一起保留,以防万一。
我正在使用 MariaDB 10.4
如果我理解正确,您想要ON DUPLICATE KEY UPDATE
:
INSERT INTO wp_postmeta (post_id, meta_key, meta_value)
SELECT o.post_id, '_new_column_name', o.meta_value
FROM wp_postmeta o
WHERE o.meta_key = '_old_column_name'
ON DUPLICATE KEY UPDATE meta_value = VALUES(o.meta_value);
为此,您需要(post_id, meta_key)
上的唯一索引/约束:
alter table wp_postmeta add constraint unq_postmeta_post_value
unique(post_id, meta_key);
使用IF.. ELSE
如下:
If exists (SELECT * FROM wp_postmeta WHERE meta_key = '_old_column_name')
Update wp_postmeta set meta_key = '_new_column_name'
Where meta_key = '_old_column_name'
Else
INSERT INTO wp_postmeta(post_id, meta_key, meta_value)
SELECT o.post_id, '_new_column_name', o.meta_value
FROM wp_postmeta o
WHERE o.meta_key = '_old_column_name'
因为我无法在(post_id, meta_key)
上添加唯一索引/约束(因为我的数据库碰巧已经有重复的 post_id/meta_key 行),所以这就是最终对我有用的方法。
希望这对将来的某人有所帮助,如果解决方案有任何问题,请告诉我:
REPLACE INTO wp_postmeta (meta_id, post_id, meta_key, meta_value)
SELECT
IFNULL(
(SELECT n.meta_id FROM wp_postmeta n
WHERE n.meta_key = '_new_column_name'
AND n.post_id = o.post_id ),
NULL
),
o.post_id, '_new_column_name', o.meta_value
FROM wp_postmeta o
WHERE meta_key = '_old_column_name';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.