在我 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() 功能的最简单解决方案是将问题分成两部分:
- 使用匹配的 slug 更新任何现有行。
- 如果没有匹配 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中文网其他相关文章!

ACID属性包括原子性、一致性、隔离性和持久性,是数据库设计的基石。1.原子性确保事务要么完全成功,要么完全失败。2.一致性保证数据库在事务前后保持一致状态。3.隔离性确保事务之间互不干扰。4.持久性确保事务提交后数据永久保存。

MySQL既是数据库管理系统(DBMS),也与编程语言紧密相关。1)作为DBMS,MySQL用于存储、组织和检索数据,优化索引可提高查询性能。2)通过SQL与编程语言结合,嵌入在如Python中,使用ORM工具如SQLAlchemy可简化操作。3)性能优化包括索引、查询、缓存、分库分表和事务管理。

MySQL使用SQL命令管理数据。1.基本命令包括SELECT、INSERT、UPDATE和DELETE。2.高级用法涉及JOIN、子查询和聚合函数。3.常见错误有语法、逻辑和性能问题。4.优化技巧包括使用索引、避免SELECT*和使用LIMIT。

MySQL是一种高效的关系型数据库管理系统,适用于存储和管理数据。其优势包括高性能查询、灵活的事务处理和丰富的数据类型。实际应用中,MySQL常用于电商平台、社交网络和内容管理系统,但需注意性能优化、数据安全和扩展性。

SQL和MySQL的关系是标准语言与具体实现的关系。1.SQL是用于管理和操作关系数据库的标准语言,允许进行数据的增、删、改、查。2.MySQL是一个具体的数据库管理系统,使用SQL作为其操作语言,并提供高效的数据存储和管理。

InnoDB使用redologs和undologs确保数据一致性和可靠性。1.redologs记录数据页修改,确保崩溃恢复和事务持久性。2.undologs记录数据原始值,支持事务回滚和MVCC。

EXPLAIN命令的关键指标包括type、key、rows和Extra。1)type反映查询的访问类型,值越高效率越高,如const优于ALL。2)key显示使用的索引,NULL表示无索引。3)rows预估扫描行数,影响查询性能。4)Extra提供额外信息,如Usingfilesort提示需要优化。

Usingtemporary在MySQL查询中表示需要创建临时表,常见于使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通过优化索引和重写查询避免其出现,提升查询性能。具体来说,Usingtemporary出现在EXPLAIN输出中时,意味着MySQL需要创建临时表来处理查询。这通常发生在以下情况:1)使用DISTINCT或GROUPBY时进行去重或分组;2)ORDERBY包含非索引列时进行排序;3)使用复杂的子查询或联接操作。优化方法包括:1)为ORDERBY和GROUPB


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver CS6
视觉化网页开发工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。