때때로 상태 값이 설정되고 가끔 그렇지 않은 python 3.x에서 MySQL 5.7.32 테이블을 업데이트하고 있습니다.
항목이없는 경우 오류가 발생하지 않도록 None으로 설정합니다.
if not 'status' in item: item['status'] = None
이제 이것은 데이터 세트 tu NULL의 값을 설정하는 것처럼 보이므로 이전 값을 지울 수 있습니다.
...
ON DUPLICATE KEY UPDATE
`STATUS` = %s
""", (
item['status'],
(긴 복잡한 쿼리)를 유지하면서 값을 다른 것으로 설정하여 업데이트되지 않도록하려면 어떻게해야합니까?
최소한의 예 :
if not 'status' in item: item['status'] = `STATUS`
self.curr.execute("""
INSERT INTO product_catalog (
`ARTICLE_ID`,
`STATUS`
)
VALUES (%s, %s)
ON DUPLICATE KEY UPDATE
`STATUS` = %s
""", (
item['ARTICLE_ID'],
item['status'],
item['status']
)
)
업데이트 부분에서 표현식을 사용하여 값이인지 확인할 수 null
있습니다 COALESCE()
. 예를 들면 다음과 같습니다.
... ON DUPLICATE KEY UPDATE `STATUS` = COALESCE(%s, `STATUS`)
""", (..., item['status'])
COALESCE()
그렇지 않은 %s
경우 첫 번째 매개 변수 (값 )를 반환하고 null
그렇지 않으면 두 번째 매개 변수 (이 경우 찾고있는 동작 인 현재 열 값)를 반환합니다.
삽입하려는 새 값을 참조하는 VALUE(columnname)
for 구문을 사용하여 명령문을 더 단순화 할 수 있으므로 ON DUPLICATE KEY UPDATE
매개 변수를 반복 할 필요가 없습니다.
INSERT INTO product_catalog (`ARTICLE_ID`, `STATUS`)
VALUES (%s, %s)
ON DUPLICATE KEY UPDATE
`STATUS` = COALESCE(VALUE(`STATUS`), `STATUS`)
""", (item['ARTICLE_ID'], item['status'])
MySQL 8.0.20부터이 구문은 더 이상 사용되지 않지만 (현재는 여전히 작동 함) 별칭을 사용하여 대체됩니다.
INSERT INTO product_catalog (`ARTICLE_ID`, `STATUS`)
VALUES (%s, %s) AS new
ON DUPLICATE KEY UPDATE
`STATUS` = COALESCE(new.`STATUS`, product_catalog.`STATUS`)
""", (item['ARTICLE_ID'], item['status'])
이 별칭 (여기에 정의 new
당신이 당신에 재사용 할 수 삽입 된 행에 대해) update
와 유사한 부분을 value()
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다