[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;
}

잘 작동합니다