programing

MySQL에서 하나의 쿼리에서 값이 다른 여러 행을 업데이트합니다.

procenter 2023. 1. 13. 20:18
반응형

MySQL에서 하나의 쿼리에서 값이 다른 여러 행을 업데이트합니다.

값이 다른 여러 행을 업데이트하는 방법을 이해하려고 하는데 잘 모르겠어요.해결책은 어디에나 있지만 나에게는 이해하기 어려워 보인다.

예를 들어, 1개의 쿼리로 3개의 업데이트를 실시합니다.

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 답변을 연장하려면

고유하지 않은 키로 업데이트를 수행해야 하는 경우 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: 온도 테이블을 드롭합니다.

php에서는multi_querymysqli 인스턴스 메서드.

$sql = "SELECT COUNT(*) AS _num FROM test;
        INSERT INTO test(id) VALUES (1); 
        SELECT COUNT(*) AS _num FROM test; ";

$mysqli->multi_query($sql);

30,000 raw 업데이트에서 트랜잭션, 삽입, 사례 방법과 결과를 비교합니다.

트랜잭션: 5.5194580554962
삽입: 0.20669293403625
케이스: 16.474853992462
멀티: 0.0412278175354

보시다시피 여러 문의 쿼리가 가장 높은 답변보다 효율적입니다.

다음과 같은 에러 메세지가 표시되는 경우에 대비합니다.

PHP Warning:  Error while sending SET_OPTION packet

이 경우 다음 값을 더 늘려야 할 수 있습니다.max_allowed_packetmysql config 파일에 있습니다.

UPDATE Table1 SET col1= col2 FROM (SELECT col2, col3 FROM Table2) as newTbl WHERE col4= col3

여기 col4와 col1은 표1에 있습니다.col2와 col3은 표2에 있습니다.
서 col4 =은 각 .col1은 col1에 대해 다릅니다. col4 = col3로 하다

나는 이렇게 했다:

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

그것은 잘 작동한다

언급URL : https://stackoverflow.com/questions/25674737/update-multiple-rows-with-different-values-in-one-query-in-mysql

반응형