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_query
mysqli 인스턴스 메서드.
$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_packet
mysql 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
'programing' 카테고리의 다른 글
마이그레이션 데이터를 MariaDB 데이터베이스로 가져올 수 없습니다. (0) | 2023.01.13 |
---|---|
PHP로 URL이 존재하는지 확인하려면 어떻게 해야 하나요? (0) | 2023.01.13 |
ERROR 1698 (28000):ubuntu에서 새로 설치할 때 mysql_secure_installation을 실행하는 동안 사용자 'root'@'localhost'에 대한 액세스가 거부되었습니다. (0) | 2023.01.13 |
Kubernetes의 Mariadb 통신 패킷을 읽는 동안 오류가 발생했습니다. (0) | 2023.01.13 |
인증 플러그인 'caching_sha2_password' 문제를 해결하는 방법 (0) | 2023.01.13 |