sql 구문 update 여러 기록 을 실행 하여 사고 방향 을 실현 합 니 다.
3312 단어 sql 구문update 다 중 기록
UPDATE mytable SET myfield='value' WHERE other_field='other_value';
그러나 여러 줄 의 데 이 터 를 업데이트 하고 줄 마다 기 록 된 필드 값 이 각각 다 르 면 어떻게 하 시 겠 습 니까?예 를 들 어 제 블 로 그 는 세 개의 분류 디 렉 터 리(무료 자원,튜 토리 얼 가이드,쇼윈도 전시)가 있 습 니 다.이 분류 디 렉 터 리 의 정 보 는 데이터베이스 시트 categories 에 저장 되 고 표시 순서 필드 display 를 설정 하 였 습 니 다.order,각 분류 가 한 줄 의 기록 을 차지 합 니 다.이 분류 목록 의 순 서 를 다시 짜 려 면(튜 토리 얼 안내,쇼윈도 전시,무료 자원)으로 바 꾸 려 면 categories 표 에 해당 하 는 줄 의 display 를 업데이트 해 야 합 니 다.order 필드 는 여러 줄 의 기록 을 업데이트 하 는 문제 와 관련 이 있 습 니 다.처음에 여러 개의 UPDATE 문 구 를 순환 적 으로 실행 하 는 방식 을 생각 할 수 있 습 니 다.예 를 들 어 다음 과 같은 phop 프로그램 예제:
foreach ($display_order as $id => $ordinal) {
$sql="UPDATE categories SET display_order = $ordinal WHERE id = $id";
mysql_query($sql);
}
이런 방법 은 아무런 오류 가 없 었 고 코드 는 간단 하고 알 기 쉬 웠 지만 순환 문 에서 SQL 조 회 를 한 번 이상 실 행 했 습 니 다.시스템 최적화 를 할 때우 리 는 항상 가능 한 한 데이터베이스 조회 횟수 를 줄 여 자원 의 점용 을 줄 이 고 시스템 속 도 를 높 일 수 있 도록 하려 고 한다.다행히도 더 좋 은 해결 방안 이 있 습 니 다.다음은 자주 사용 하 는 두 가지 방안 을 열거 합 니 다.SQL 문 구 는 약간 복잡 하지만 한 번 의 조회 만 실행 하면 됩 니 다.문법 은 다음 과 같 습 니 다.우 리 는 다음 과 같은 SQL 문 구 를 사용 할 수 있 습 니 다.
UPDATE mytable
SET myfield = CASE other_field
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
이상 의 방안 은 데이터 뱅 크 의 조회 조작 횟수 를 크게 줄 이 고 시스템 자원 을 크게 절약 할 수 있 습 니 다.그러나 어떻게 우리 의 프로 그래 밍 언어 와 결합 해 야 합 니까?우 리 는 방금 분류 한 디 렉 터 리 의 예 를 사용 합 니 다.다음은 phop 의 프로그램 예제 입 니 다.
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
이 예 에서 모두 8 줄 의 데 이 터 를 업 데 이 트 했 지만 데이터 베 이 스 를 한 번 만 실 행 했 습 니 다.8 번 의 UPDATE 문 구 를 순환 적 으로 실행 하 는 것 보다 상기 사례 가 절약 하 는 시간 은 보잘것없다 고 할 수 있 습 니 다.하지만 생각해 보 세 요.10,000 또는 더 많은 줄 기록 을 업데이트 해 야 할 때 그 중의 좋 은 점 을 발견 할 수 있 습 니 다!유일 하 게 주의해 야 할 문 제 는 SQL 문장의 길이 입 니 다.프로그램 운영 환경 이 지원 하 는 문자열 의 길 이 를 고려 해 야 합 니 다.제 가 현재 얻 은 데 이 터 는 SQL 문장의 길이 가 1,000,960 에 달 했 고 phop 에서 도 순조롭게 실 행 될 수 있 습 니 다.phop 문 서 를 조 회 했 지만 문자 문자열 의 최대 길 이 를 명확 하 게 규정 하지 못 했 습 니 다.두 번 째 INSERT 방식 MySql 에서 INSERT 문법 은 하나의 조건 을 가지 고 있 습 니 다.DUPLICATE KEY UPDATE.이 문법 은 기록 이 존재 하 는 지 여 부 를 판단 하고 존재 하지 않 으 면 업데이트 하 는 기록 을 삽입 하 는 데 적합 합 니 다.위의 상황 을 바탕 으로 기록 을 업데이트 할 때 insert 문 구 를 사용 하지만 메 인 키 가 중복 되 는 것 을 제한 할 때 필드 를 업데이트 합 니 다.다음 과 같 습 니 다:
$display_order = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
$sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); // SQL
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;
mysql_query($sql);
주의:ON DUPLICATE KEY UPDATE 는 MySQL 특유 의 문법 일 뿐 SQL 표준 문법 이 아 닙 니 다!