SQL-在一个查询中更新多条记录

我有 配置桌。 图式: config_name | config_value

我想在一个查询中更新多个记录,我尝试这样做:

UPDATE config
SET t1.config_value = 'value'
, t2.config_value = 'value2'
WHERE t1.config_name = 'name1'
AND t2.config_name = 'name2';

但这个问题是错误的:

你能帮我吗?

907571 次浏览

尝试多表更新语法

UPDATE config t1 JOIN config t2
ON t1.config_name = 'name1' AND t2.config_name = 'name2'
SET t1.config_value = 'value',
t2.config_value = 'value2';

这里是一个 译自: 美国《科学》杂志网站(http://SQLFiddle.com/# ! 2/84ef4/1)演示

或条件更新

UPDATE config
SET config_value = CASE config_name
WHEN 'name1' THEN 'value'
WHEN 'name2' THEN 'value2'
ELSE config_value
END
WHERE config_name IN('name1', 'name2');

这里是一个 译自: 美国《科学》杂志网站(http://SQLFiddle.com/# ! 2/e820f/1)演示

您可以使用 INSERT 完成如下操作:

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

这将向表中插入新的值,但是如果重复主键(已经插入到表中) ,则将更新您指定的值,并且不会再次插入相同的记录。

在我的情况下,我必须更新的记录超过1000,为此,而不是打更新查询每次我喜欢这个,

   UPDATE mst_users
SET base_id = CASE user_id
WHEN 78 THEN 999
WHEN 77 THEN 88
ELSE base_id END WHERE user_id IN(78, 77)

78和77是用户 ID,对于这些用户 ID,我需要分别更新 base _ id 999和88。这对我有用。

如果要更新所有列中的所有记录,请执行以下代码:

update config set column1='value',column2='value'...columnN='value';

如果要更新特定行的所有列,则执行以下代码:

update config set column1='value',column2='value'...columnN='value' where column1='value'

也许对某些人会有用

因为 Postgreql 9.5是一种魅力

INSERT INTO tabelname(id, col2, col3, col4)
VALUES
(1, 1, 1, 'text for col4'),
(DEFAULT,1,4,'another text for col4')
ON CONFLICT (id) DO UPDATE SET
col2 = EXCLUDED.col2,
col3 = EXCLUDED.col3,
col4 = EXCLUDED.col4

这个 SQL 更新现有的记录,如果新的记录插入(2合1)

卡米尔的办法奏效了。将其转换为一个基本的 PHP 函数,用于编写 SQL 语句。希望这能帮到别人。

    function _bulk_sql_update_query($table, $array)
{
/*
* Example:
INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);
*/
$sql = "";


$columns = array_keys($array[0]);
$columns_as_string = implode(', ', $columns);


$sql .= "
INSERT INTO $table
(" . $columns_as_string . ")
VALUES ";


$len = count($array);
foreach ($array as $index => $values) {
$sql .= '("';
$sql .= implode('", "', $array[$index]) . "\"";
$sql .= ')';
$sql .= ($index == $len - 1) ? "" : ", \n";
}


$sql .= "\nON DUPLICATE KEY UPDATE \n";


$len = count($columns);
foreach ($columns as $index => $column) {


$sql .= "$column=VALUES($column)";
$sql .= ($index == $len - 1) ? "" : ", \n";
}


$sql .= ";";


return $sql;
}

假设您在 Excel 电子表格中有要更新的值列表,答1列中的 Config _ valueB1列中的 Config _ name,您可以很容易地使用 Excel 公式在那里编写查询,如

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")

而不是这样

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

你可以利用

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');

执行下面的代码来更新 n 个行,其中 Parent ID 是您想要从中获取数据的 ID,Child ID 是您需要更新的 ID,所以只需要添加父 ID 和子 ID 来使用一个小脚本更新所有您需要的行。

 UPDATE [Table]
SET column1 = (SELECT column1 FROM Table WHERE IDColumn = [PArent ID]),
column2 = (SELECT column2 FROM Table WHERE IDColumn = [PArent ID]),
column3 = (SELECT column3 FROM Table WHERE IDColumn = [PArent ID]),
column4 = (SELECT column4 FROM Table WHERE IDColumn = [PArent ID]),
WHERE IDColumn IN ([List of child Ids])
INSERT INTO tablename
(name, salary)
VALUES
('Bob', 1125),
('Jane', 1200),
('Frank', 1100),
('Susan', 1175),
('John', 1150)
ON DUPLICATE KEY UPDATE salary = VALUES(salary);

尝试多表更新语法

尝试复制和 SQL 查询:

CREATE TABLE #temp (id int, name varchar(50))
CREATE TABLE #temp2 (id int, name varchar(50))


INSERT INTO #temp (id, name)
VALUES (1,'abc'), (2,'xyz'), (3,'mno'), (4,'abc')


INSERT INTO #temp2 (id, name)
VALUES (2,'def'), (1,'mno1')


SELECT * FROM #temp
SELECT * FROM #temp2


UPDATE t
SET name = CASE WHEN t.id = t1.id THEN t1.name ELSE t.name END
FROM #temp t
INNER JOIN #temp2 t1 on t.id = t1.id
 

select * from #temp
select * from #temp2


drop table #temp
drop table #temp2

UPDATE 2021/MySql v8.0.20及更高版本

最受欢迎的答案建议使用 VALUES函数,现在对于 ON DUPLICATE KEY UPDATE语法使用 不赞成函数。在 v8.0.20中,使用 VALUES 函数会得到一个弃用警告:

INSERT INTO chart (id, flag)
VALUES (1, 'FLAG_1'),(2, 'FLAG_2')
ON DUPLICATE KEY UPDATE id = VALUES(id), flag = VALUES(flag);

[ HY000][1287]‘ VALUES 函数’已被弃用,将在未来的版本中删除。请使用别名(INSERT INTO... VALUES (...)作为别名) ,并将 ON DUPLICATE KEY UPDATE 子句中的 VALUES (col)替换为 alias.col

改为使用新的别名语法:

INSERT INTO chart (id, flag)
VALUES (1, 'FLAG_1'),(2, 'FLAG_2') AS aliased
ON DUPLICATE KEY UPDATE flag=aliased.flag;

只需创建一个事务语句,使用多个 update 语句并提交。在出错的情况下,您可以通过启动事务来回滚修改句柄。

START TRANSACTION;
/*Multiple update statement*/
COMMIT;

(此语法适用于 MySQL,适用于 PostgreSQL,将‘ START TRANSACTION’替换为‘ BEGIN’)

更新 table name SET field name = ‘ value’WHERE table name.primary key

如果需要一次更新几行,可以选择 事先准备好的声明:

  • 数据库遵循您第一次提供的 查询模式,保留当前连接的编译结果(取决于实现)。
  • 然后通过在 SQL 语法中发送带有不同参数的 所配制功能的缩写标签来更新所有行,而不是为了多次更新而多次发送整个 UPDATE语句
  • 数据库解析与预编译结果链接的 所配制功能的缩写标签,然后执行更新。
  • 下次执行行更新时,数据库可能仍然使用预编译的结果并快速完成操作(因此可以省略上面的第一步,因为编译可能需要时间)。

这里是 ready 语句的 PostgreSQL 示例,许多 SQL 数据库(例如 MariaDB、 MySQL、 Oracle)也支持它。