首页 > 数据库 > mysql教程 > 如何使用单个 SQL 语句根据两个条件高效地在数据库表中插入或更新行?

如何使用单个 SQL 语句根据两个条件高效地在数据库表中插入或更新行?

Mary-Kate Olsen
发布: 2024-12-29 07:38:11
原创
533 人浏览过

How can I efficiently insert or update rows in a database table based on two conditions using a single SQL statement?

INSERT INTO 或 UPDATE 有两个条件

此查询涉及有效管理插入新行和现有行的表中的数据的挑战需要根据具体条件更新行。该表具有以下架构:

ID INTEGER PRIMARY KEY AUTOINCREMENT
name INTEGER
values1 INTEGER
values2 INTEGER
dates DATE
登录后复制

目标是当给定的“名称”和“日期”组合有新数据时插入新行。但是,如果已存在具有相同“名称”和“日期”的行,则应更新该行,而不是插入重复行。

初始解决方案可能涉及使用存储过程 (SPROC)检查条件并执行适当的操作。然而,由于数据是从另一种语言推送的,这种方法不可行。

最佳解决方案是利用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语法。这允许单个语句根据指定条件插入新行并更新现有行。

在这种情况下,您可以在表上定义唯一的复合键(名称、日期):

unique key(name,dates)
登录后复制

这个唯一键确保“名称”和“日期”的组合不能在表中多次存在。执行 INSERT 查询时,可以使用 ON DUPLICATE KEY UPDATE 子句指定发生唯一键违规时要采取的操作:

INSERT INTO myThing (name, values1, values2, dates)
VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;
登录后复制

使用这种方法,如果具有 'name' 的行并且提供的“日期”已经存在,其values2列将增加而不是创建新行。此行为有效地使用新数据更新现有行。

为了说明该功能,请考虑以下示例:

-- Create the table with the composite unique key
CREATE TABLE myThing (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name INT NOT NULL,
    values1 INT NOT NULL,
    values2 INT NOT NULL,
    dates DATE NOT NULL,
    UNIQUE KEY (name, dates)
);

-- Insert a new row or update an existing row
INSERT INTO myThing (name, values1, values2, dates)
VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;

-- Insert another new row or update the existing row for 'name' 777
INSERT INTO myThing (name, values1, values2, dates)
VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;

-- Insert a new row for 'name' 778
INSERT INTO myThing (name, values1, values2, dates)
VALUES (778, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;

-- Retrieve the results
SELECT * FROM myThing;
登录后复制

这将产生以下输出:

+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates      |
+----+------+---------+---------+------------+
| 1  | 777  | 1       | 2       | 2015-07-11 |
| 2  | 778  | 1       | 1       | 2015-07-11 |
+----+------+---------+---------+------------+
登录后复制

很明显,“name”777 的行已使用新数据进行了更新,同时为“name”创建了一个新行778.

以上是如何使用单个 SQL 语句根据两个条件高效地在数据库表中插入或更新行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板