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中文网其他相关文章!