我有桌子 - 配置。
架构:
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';
但该查询错误:(
你能帮助我吗?
答案 0 :(得分:128)
尝试多表更新语法
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';
这是 SQLFiddle 演示
或条件更新
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');
这是 SQLFiddle 演示
答案 1 :(得分:113)
您可以使用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);
这会将新值插入表中,但如果主键重复(已插入表中),则指定的值将更新,并且第二次不会插入相同的记录。
答案 2 :(得分:8)
在我的情况下,我必须更新超过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.这对我有用。
答案 3 :(得分:5)
也许对某人有用
for Postgresql 9.5作为魅力
>>> x.fit(a,b)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False)
>>> x.predict(...) # replace ellipsis with an array of 25 features/floats
此SQL更新现有记录并插入新的(2合1)
答案 4 :(得分:3)
Camille的解决方案奏效了。把它变成了一个基本的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;
}
答案 5 :(得分:3)
执行下面的代码以更新n行,其中父ID是您要从中获取数据的ID,子ID是您需要更新的ID,因此只需添加父ID和子ID id可以使用一个小的脚本来更新您需要的所有行。
UPDATE [Table]
SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
WHERE IDCouloumn IN ([List of child Ids])
答案 6 :(得分:2)
如果要更新所有列中的所有记录,请执行以下代码:
update config set column1='value',column2='value'...columnN='value';
如果您想更新特定行的所有列,请执行以下代码:
update config set column1='value',column2='value'...columnN='value' where column1='value'
答案 7 :(得分:0)
假定您具有要在Excel电子表格中更新的值列表,其中 A1 列中的 config_value 和 B1中的 config_name 中的< / strong>,您可以使用Excel公式(如
)在此处轻松地编写查询 In these combinations, link a DLL as usual, but pass -Bstatic instead of -Bdynamic to indicate prefering static libraries.
答案 8 :(得分:0)
代替此
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');
答案 9 :(得分:0)
尝试多表更新语法
试试复制和 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
答案 10 :(得分:0)
投票最多的答案建议使用 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 (...) AS 别名)并将 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;
答案 11 :(得分:-2)
INSERT INTO tablename
(name, salary)
VALUES
('Bob', 1125),
('Jane', 1200),
('Frank', 1100),
('Susan', 1175),
('John', 1150)
ON DUPLICATE KEY UPDATE salary = VALUES(salary);