MySQL-하나의 쿼리에서 다른 값으로 여러 행 업데이트


139

다른 값으로 여러 행을 업데이트하는 방법을 이해하려고하는데 그것을 얻지 못합니다. 해결책은 어디에나 있지만 나에게는 이해하기 어려운 것 같습니다.

예를 들어, 하나의 쿼리에 대한 세 가지 업데이트 :

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 조건에 여러 조건이있는 경우 쿼리를 수행하는 방법이 완전히 명확하지 않습니다. 아이디어?


이것이 귀하의 질문에 대답합니까? MySQL의 여러 업데이트
PeterPan666

답변:


188

이 방법으로 할 수 있습니다 :

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';

날짜 형식을 이해하지 못합니다. 날짜는 기본 날짜 및 시간 유형을 사용하여 데이터베이스에 저장해야합니다.


레코드가 이미 존재하는 경우 업데이트가 실행되도록하려면 어떻게해야합니까
franvergara66

1
@ franvergara66. . . 귀하의 의견을 이해하지 못합니다. update이미 존재하는 레코드에만 영향을줍니다.
Gordon Linoff

내 영어 실례를 실례합니다. mysql을 업데이트하려고하면 오류가 발생합니다. # 1062-키 'PRIMARY'에 대한 중복 항목 'XXX'. 이미 가지고있는 것과 동일한 값으로 레코드를 업데이트하려고 할 때 현재 값이 업데이트되는 것과 동일한 경우 업데이트를 건너 뛸 수있는 방법이 있습니까?
franvergara66

1
@ franvergara66. . . 다른 문제가있을 수 있습니다. 경우 cod_user기본 키이며, 값이 주위에 단행되고, 다음 여러 업데이트 아마도 최선의 경로입니다.
Gordon Linoff

1
그래, 진짜 문제는 여러 조수가 있고 업데이트를 시도 할 때 기본 키의 무결성이 침해된다는 것입니다. 시간 내 주셔서 대단히 감사합니다.
franvergara66

108

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 목록에 추가하십시오. 둘 중 어느 것도 기본 키가 아닌 경우 (아마도 없을 것 같음)이 방법은 항상 새로운 레코드를 생성합니다.

그러나이 접근법은 준비된 진술을보다 쉽고 간결하게 작성합니다.


4
감사합니다! 이것은, 내가 특별히,이 구문을 알아낼 수없는 내가, 오랫동안 깨끗한 찾는 방법을 검색 한 것입니다 cod_user=VALUES(cod_user), ...심지어 공식 MySQL의 5.6 문서에서,
YURIY Dyachkov

18
참고 : 키가 테이블에 없으면 원하지 않는 레코드가 생성 될 경우 새 행이 추가됩니다.
Faraz

1
절대 삽입하지 않는 IODKU를 사용하는 것이 까다 롭지 만 매우 우아합니다.
Tom Desp

이 접근 방식 에는 테이블에 기본 키가 설정되어 있어야합니다.
FlameStorm

5
SQL은 실제로 업데이트에 의지하기 전에 새 레코드를 작성하려고 시도하기 때문에 널이 될 수없는 열을 생략하면 작동하지 않습니다.
Arno van Oordt

15

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';

1
CASE 문의 끝에 오타가 있습니다. 서로 쉼표가 2 개 있습니다.
pmrotule

8
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';

0

@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 단계 : 임시 테이블 삭제


0
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을 업데이트하려고합니다.


-1

나는 이렇게했다 :

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

잘 작동합니다


저자는 1 개의 쿼리를 원하지만, foreach로 수행 할 수 있다는 것이 분명하다. 이는 여러 개의 쿼리를 만들 것이다
Hristo93
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.