SQL-하나의 쿼리에서 여러 레코드 업데이트
table- 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';
그러나 그 쿼리는 잘못되었습니다 :(
도와주세요?
다중 테이블 업데이트 구문을 사용해보십시오.
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은 사용자 ID이며 해당 사용자 ID의 경우 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 in 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;
}
모든 열의 모든 레코드를 업데이트하려면 아래 코드를 실행하십시오.
update config set column1='value',column2='value'...columnN='value';
특정 행의 모든 열을 업데이트하려면 아래 코드를 실행하십시오.
update config set column1='value',column2='value'...columnN='value' where column1='value'
A1 열에 config_value 와 B1에 config_name 을 사용하여 Excel 스프레드 시트에서 업데이트 할 값 목록이 있다고 가정하면 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');
참고 URL : https://stackoverflow.com/questions/20255138/sql-update-multiple-records-in-one-query
'IT박스' 카테고리의 다른 글
java.lang.NoClassDefFoundError : Java 메일 용 JUnit 테스트 케이스의 경우 com / sun / mail / util / MailLogger (0) | 2020.08.03 |
---|---|
방법이 존재하는지 확인 (0) | 2020.08.03 |
데이터 정렬의 잘못된 혼합 MySQL 오류 (0) | 2020.08.03 |
파이썬에서 목록에서 중복 dict 제거 (0) | 2020.08.03 |
특정 파이썬 버전에 대해 pip를 사용하여 모듈 설치 (0) | 2020.08.03 |