[mysql] MySQL-하나의 쿼리에서 다른 값으로 여러 행 업데이트
다른 값으로 여러 행을 업데이트하는 방법을 이해하려고하는데 그것을 얻지 못합니다. 해결책은 어디에나 있지만 나에게는 이해하기 어려운 것 같습니다.
예를 들어, 하나의 쿼리에 대한 세 가지 업데이트 :
UPDATE table_users
SET cod_user = '622057'
, date = '12082014'
WHERE user_rol = 'student'
AND cod_office = '17389551';
UPDATE table_users
SET cod_user = '2913659'
, date = '12082014'
WHERE user_rol = 'assistant'
AND cod_office = '17389551';
UPDATE table_users
SET cod_user = '6160230'
, date = '12082014'
WHERE user_rol = 'admin'
AND cod_office = '17389551';
나는 읽고 예를,하지만 난 정말 쿼리를 만드는 방법을 이해하지 않습니다. 즉 :
UPDATE table_to_update
SET cod_user= IF(cod_office = '17389551','622057','2913659','6160230')
,date = IF(cod_office = '17389551','12082014')
WHERE ?? IN (??) ;
WHERE와 IF 조건에 여러 조건이있는 경우 쿼리를 수행하는 방법이 완전히 명확하지 않습니다. 아이디어?
답변
이 방법으로 할 수 있습니다 :
UPDATE table_users
SET cod_user = (case when user_role = 'student' then '622057'
when user_role = 'assistant' then '2913659'
when user_role = 'admin' then '6160230'
end),
date = '12082014'
WHERE user_role in ('student', 'assistant', 'admin') AND
cod_office = '17389551';
날짜 형식을 이해하지 못합니다. 날짜는 기본 날짜 및 시간 유형을 사용하여 데이터베이스에 저장해야합니다.
답변
MySQL을 사용하면보다 쉽게 읽을 수있는 여러 업데이트를 단일 쿼리로 결합 할 수 있습니다. 이것은 당신이 묘사 한 시나리오에 더 잘 맞는 것처럼 보이고, 읽기가 훨씬 쉬우 며, 풀기 어려운 여러 조건을 피합니다.
INSERT INTO table_users (cod_user, date, user_rol, cod_office)
VALUES
('622057', '12082014', 'student', '17389551'),
('2913659', '12082014', 'assistant','17389551'),
('6160230', '12082014', 'admin', '17389551')
ON DUPLICATE KEY UPDATE
cod_user=VALUES(cod_user), date=VALUES(date)
이것은 user_rol, cod_office
조합이 기본 키 라고 가정합니다 . 이들 중 하나만 기본 키 인 경우 다른 필드를 UPDATE 목록에 추가하십시오. 둘 중 어느 것도 기본 키가 아닌 경우 (아마도 없을 것 같음)이 방법은 항상 새로운 레코드를 생성합니다.
그러나이 접근법은 준비된 진술을보다 쉽고 간결하게 작성합니다.
답변
CASE
명령문을 사용하여 여러 if / then 시나리오를 처리 할 수 있습니다.
UPDATE table_to_update
SET cod_user= CASE WHEN user_rol = 'student' THEN '622057'
WHEN user_rol = 'assistant' THEN '2913659'
WHEN user_rol = 'admin' THEN '6160230'
END
,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';
답변
update table_name
set cod_user =
CASE
WHEN user_rol = 'student' THEN '622057'
WHEN user_rol = 'assistant' THEN '2913659'
WHEN user_rol = 'admin' THEN '6160230'?
END,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';
답변
@Trevedhek answer 에서 확장하려면
고유하지 않은 키를 사용하여 업데이트를 수행해야하는 경우 4 개의 쿼리가 필요합니다.
참고 : 이것은 거래 안전하지 않습니다
이것은 임시 테이블을 사용하여 수행 할 수 있습니다.
1 단계 : 업데이트하려는 임시 테이블 키 및 열 만들기
CREATE TEMPORARY TABLE temp_table_users
(
cod_user varchar(50)
, date varchar(50)
, user_rol varchar(50)
, cod_office varchar(50)
) ENGINE=MEMORY
2 단계 : 임시 테이블에 값 삽입
3 단계 : 원본 테이블 업데이트
UPDATE table_users t1
JOIN temp_table_users tt1 using(user_rol,cod_office)
SET
t1.cod_office = tt1.cod_office
t1.date = tt1.date
4 단계 : 임시 테이블 삭제
답변
UPDATE Table1 SET col1= col2 FROM (SELECT col2, col3 FROM Table2) as newTbl WHERE col4= col3
여기 col4 & col1은 Table1에 있습니다. col2 & col3은 표 2에 있습니다
. col4 = col3 각 행마다 다른 값으로 각 col1을 업데이트하려고합니다.
답변
나는 이렇게했다 :
<update id="updateSettings" parameterType="PushSettings">
<foreach collection="settings" item="setting">
UPDATE push_setting SET status = #{setting.status}
WHERE type = #{setting.type} AND user_id = #{userId};
</foreach>
</update>
PushSettings가있는 곳
public class PushSettings {
private List<PushSetting> settings;
private String userId;
}
잘 작동합니다