首页 数据库 mysql教程 在数据库中更新插入不使用主键或唯一约束的行

在数据库中更新插入不使用主键或唯一约束的行

Oct 19, 2024 am 10:52 AM

Upsert a row in a DB that doesn

在我 7 年的程序员职业生涯中,我大部分时间都是通过 ORM 与 SQL 交互。我发现 Laravel 的 Eloquent ORM 的一个特别有用的功能是它的 updateOrInsert() 方法:

DB::table('posts')
    ->updateOrInsert(
        ['slug' => 'about'], // matching condition
        ['content' => 'Like and subscribe'] // created or updated values
    );
登录后复制

在上面的示例中,Eloquent 将在 posts 表中查找 slug 等于“about”的行。如果存在带有该 slug 的行,Eloquent 会将该行的内容更新为“点赞并订阅”。如果行存在于该slug中,Eloquent将创建一个新行,其中包含“about”和“Like and subscribe”的内容。

问题:没有主键或唯一约束

我目前正在编写一个迁移脚本,用于将页面数据从旧的 WordPress 站点移动到新的 WordPress 站点。该脚本连接到旧站点的数据库,然后创建一个可以导入到新站点的数据库中的 SQL 文件。新网站已有一些已手动移动的页面,但其内容可能已过时。当新站点上已经存在页面时,我们不想再次创建它:我们想要更新已经存在的页面。我们可以通过使用 WordPress 数据库中的 post_name 列来确定该页面是否已经存在,该列对应于页面的 URL slug。

如果 post_name 是主键,我们可以使用 REPLACE 语句完成类似于 Eloquent 的 createOrUpdate() 方法的操作,但 post_name 不是主键。

如果 post_name 有唯一约束,我们可以使用 INSERT ... ON DUPLICATE KEY UPDATE 语句完成类似于 Eloquent 的 createOrUpdate() 方法的操作,但 post_name 没有唯一约束。

啊,WordPress 的乐趣。

我研究了 MySQL 的 IF 语句,但 IF 语句仅适用于存储过程、触发器和函数。我不想在要导入到新站点数据库的 SQL 文件中创建存储过程,因此我必须搜索其他选项。

解决方案:2条语句

我能找到的在纯 SQL 中模拟 Eloquent 的 updateOrInsert() 功能的最简单解决方案是将问题分成两部分:

  1. 使用匹配的 slug 更新任何现有行。
  2. 如果没有匹配 slugs 的行,则创建一个新行。

实际情况如下:

-- Update the post if it already exists.

UPDATE wp_posts
SET post_type = 'page',
    post_title = 'About',
    post_content = 'Like and subscribe'
WHERE post_name = 'about';

-- Create a new post if it does not exist.

INSERT INTO wp_posts (post_name, post_type, post_title, post_content)
SELECT 'about', 'page', 'About', 'Like and subscribe'
WHERE NOT EXISTS (
    SELECT 1
    FROM wp_posts
    WHERE post_name = 'about'
);
登录后复制

注意:为了简洁和清晰起见,此示例省略了许多 WordPress 所需的 wp_posts 列。

了解 INSERT ... SELECT 语句对我来说是“顿悟”时刻。它的目的是使用另一个表的查询结果来一次执行多次插入。但是,您可以通过提供自己的值来使用和滥用 SQL 的功能,并且仅当 post_name 为“about”的帖子不存在时才执行插入。

这是解决这个问题最优雅、最有效的解决方案吗?可能不会。但对于 WordPress 站点的一次性迁移来说,它已经足够好了,并且它允许您更新或插入一行,而无需存储过程或任何应用程序逻辑。希望这篇文章能够帮助您在不借助 ORM 的情况下编写强大的查询。

以上是在数据库中更新插入不使用主键或唯一约束的行的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

减少在Docker中使用MySQL内存的使用 减少在Docker中使用MySQL内存的使用 Mar 04, 2025 pm 03:52 PM

减少在Docker中使用MySQL内存的使用

如何使用Alter Table语句在MySQL中更改表? 如何使用Alter Table语句在MySQL中更改表? Mar 19, 2025 pm 03:51 PM

如何使用Alter Table语句在MySQL中更改表?

mysql无法打开共享库怎么解决 mysql无法打开共享库怎么解决 Mar 04, 2025 pm 04:01 PM

mysql无法打开共享库怎么解决

在 Linux 中运行 MySQl(有/没有带有 phpmyadmin 的 podman 容器) 在 Linux 中运行 MySQl(有/没有带有 phpmyadmin 的 podman 容器) Mar 04, 2025 pm 03:54 PM

在 Linux 中运行 MySQl(有/没有带有 phpmyadmin 的 podman 容器)

什么是 SQLite?全面概述 什么是 SQLite?全面概述 Mar 04, 2025 pm 03:55 PM

什么是 SQLite?全面概述

在MacOS上运行多个MySQL版本:逐步指南 在MacOS上运行多个MySQL版本:逐步指南 Mar 04, 2025 pm 03:49 PM

在MacOS上运行多个MySQL版本:逐步指南

如何为MySQL连接配置SSL/TLS加密? 如何为MySQL连接配置SSL/TLS加密? Mar 18, 2025 pm 12:01 PM

如何为MySQL连接配置SSL/TLS加密?

哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么? 哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么? Mar 21, 2025 pm 06:28 PM

哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么?

See all articles