SQL-обновление нескольких записей в одном запросе
у меня есть стол - config.
Схема:
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';
но этот запрос не так :(
вы можете мне помочь?
6 ответов
попробуйте любой синтаксис обновления нескольких таблиц
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 демо
вы можете выполнить его с помощью 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-это идентификаторы пользователей, и для этих идентификаторов пользователей мне нужно обновить base_id 999 и 88 соответственно.Это работает для меня.
может, кому-то это будет полезно
для Postgresql 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 в одном)
выполнить ниже код, если вы хотите обновить все записи во всех столбцах:
update config set column1='value',column2='value'...columnN='value';
и если вы хотите обновить все столбцы определенной строки, выполните следующий код:
update config set column1='value',column2='value'...columnN='value' where column1='value'
решение Камиллы сработало. Превратил его в базовую функцию 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;
}