삽입...어디에서 중복된 키를 갱신할 때?
하고 있어요INSERT ... ON DUPLICATE KEY UPDATE
단, 업데이트 부분은 조건부로 해야 하며, 추가 조건이 변경된 경우에만 업데이트를 해야 합니다.
하지만,WHERE
이 경우 허용되지 않습니다.UPDATE
이 문제를 해결할 방법이 있습니까?
INSERT/UPDATE/SELECT 조합은 복제 작업을 수행해야 하므로 수행할 수 없습니다.
그러기 위해서는 IF()를 사용하는 것이 좋습니다.
참조: 조건부 복제 키업데이트와 mysql
INSERT INTO daily_events (created_on, last_event_id, last_event_created_at)
VALUES ('2010-01-19', 23, '2010-01-19 10:23:11')
ON DUPLICATE KEY UPDATE
last_event_id = IF(last_event_created_at < VALUES(last_event_created_at), VALUES(last_event_id), last_event_id);
이게 우리의 마지막 해결책이야, 마법처럼 효과가 있어!
삽입 ignore는 행이 마스터와 슬레이브 둘 다에 존재하는지 확인합니다.
업데이트... 여기서 모든 복제가 완료된 후 가장 최근의 업데이트만 글로벌하게 최종 결과가 됩니다.
mysql> desc test;
+-------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+-------------------+-------+
| id | int(11) | NO | PRI | NULL | |
| value | varchar(255) | YES | | NULL | |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
+-------+--------------+------+-----+-------------------+-------+
mysql> insert ignore into test values (4, "foo", now());
mysql> update test set value = "foo", ts = now() where id = 4 and ts <= now();
두 개의 삽입문을 사용할 수 있습니다.소스 데이터의 선택 부분에 where 절을 추가할 수 있기 때문입니다.
두 데이터 세트를 선택합니다. 하나는 '복제 시'로 삽입하고 다른 하나는 '복제 시'로 삽입하지 않습니다.
개요
- AWUpsertCondy가 AFTER로 변경하려고 합니다.
문제
- AWUpsertCondy는 MySQL이 중복된 기본 키를 감지하는 경우 삽입 쿼리가 실패하지 않도록 합니다.
- MySQL은 다음을 포함하는 조건부 WHERE 절을 지원하지 않습니다.
ON DUPLICATE KEY UPDATE
솔루션
- MySQL은 conditional 절을 지원합니다.
IF()
기능. - 여기에서는 사용자 ID가 9 미만인 항목만 갱신하는 간단한 조건이 있습니다.
INSERT INTO zzdemo_table02
(lname,userid)
SELECT
lname,userid
FROM(
SELECT
lname,userid
FROM
zzdemo_table01
) as tt01
ON DUPLICATE KEY UPDATE
userid=IF(@doupdate:=IF( (tt01.userid < 9) , True, False),
tt01.userid, zzdemo_table02.userid)
,lname=IF(@doupdate, tt01.lname , zzdemo_table02.lname )
;
함정
- MySQL 변수를 소개합니다.
@doupdate
UPDATE 행이 조건을 충족하는지 여부를 플래그를 지정합니다.그런 다음 UPDATE 문에서 사용하는 모든 데이터베이스 열에 동일한 변수를 사용합니다. - 첫 번째 조건에서는 변수를 선언하고 조건이 적용되는지 여부를 결정합니다.이 접근법은 WHERE 조항보다 더 번거롭다고 할 수 있습니다.
「 」를 참조해 주세요.
테이블
php_lock
:
name
: idString,locked
:부울,time
: 개요,locked_by
: 문자열
삽입 또는 갱신할 값
1, CURRENT_TIMESTamp, '스크립트'
어디에name
='www' ANDlocked
=2
INSERT INTO `php_lock` (`name`, locked, `time`, `locked_by`)
(SELECT * FROM
(SELECT `name`,1,CURRENT_TIMESTAMP, 'script' FROM `php_lock`
WHERE `name`='wwww' AND `locked`=2
UNION (
SELECT 'wwww',1 ,CURRENT_TIMESTAMP, 'script')
) AS temp LIMIT 1)
ON DUPLICATE KEY UPDATE locked=VALUES(locked), `time`=VALUES(`time`), `locked_by`=VALUES(`locked_by`);
On duplicate key
where 절을 사용할 수 없도록 합니다.그러므로 두 가지 대안이 있습니다.
대부분의 시간을 알고 있으면 중복된 키를 얻을 수 있습니다.
a. Update the table first using update query and where clause b. If update fails then insert the record into table using insert query
테이블에 삽입할 대부분의 시간을 알고 있는 경우
a. Insert the record into table using insert ignore query - what it does is actually ignore the insert if duplicate key found b. If insert ignore fails then update the record using update query
여기를 클릭해 주세요.
언급URL : https://stackoverflow.com/questions/2469457/insert-on-duplicate-key-update-with-where
'programing' 카테고리의 다른 글
컴포넌트를 소품으로 전달하여 Vue의 자 컴포넌트에 사용할 수 있습니까? (0) | 2022.09.20 |
---|---|
Java 프로젝트에는 어떤 코드 분석 도구를 사용하고 있습니까? (0) | 2022.09.20 |
컨스턴스 포인터의 의미가 뭐야? (0) | 2022.09.20 |
Nuxtjs: 페이지 헤더에 데이터를 표시하는 가장 좋은 방법 (0) | 2022.09.20 |
Base64 문자열을 이미지 파일로 변환하시겠습니까? (0) | 2022.09.08 |