【问题标题】:SQL check if non-unique record exists—If it does, UPDATE; if not, INSERT the record INTO the tableSQL 检查是否存在非唯一记录——如果存在,则更新;如果不是,则将记录插入表中
【发布时间】:2021-03-29 14:57:25
【问题描述】:

这似乎是一种常见的情况,但我似乎找不到任何东西。

我正在尝试在 wp_postmeta 表上复制 WordPress 数据库中的一些记录,并更改副本上的 meta_key 值。

但是,一些具有meta_key 值的行已经存在,并且带有空白的meta_value 字段。因此,在复制时,我想检查具有给定 post_id 和 meta_key 值的记录是否存在,如果存在,则更新它;如果没有,则将记录 INSERT INTO 表中。

由于它是 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?

标签: mysql sql wordpress mariadb


【解决方案1】:

如果我理解正确,你想要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);

【讨论】:

  • 当您使用它时,请执行here 中的提示。您将获得性能提升。
【解决方案2】:

如下使用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'

【讨论】:

    【解决方案3】:

    因为我无法在 (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';
    

    【讨论】:

    • REPLACE 是 DELETE 加上 INSERT。所以这可能总是比 IODKU 更糟糕。通过唯一性约束,您可以避免该子查询。 (需要其他一些修复。)
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2021-09-03
    • 2012-10-09
    • 2021-11-14
    • 2014-04-04
    相关资源
    最近更新 更多