繁体   English   中英

SQL 检查是否存在非唯一记录——如果存在,则更新; 如果不是,则将记录插入表中

[英]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_idmeta_key值的记录是否存在,如果存在,则更新它; 如果没有,则将记录插入表中。

由于它是 wp_postmeta 表,因此许多记录可能具有非唯一的post_idmeta_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM