이 쿼리는 정말 안전하지 않은가요?
다음 쿼리는 원하는 대로 실행되고 있지만 원격 관리 도구(heidisql)를 사용하여 실행하면 다음과 같은 메시지가 나타납니다.
참고: BINLOG_FORMAT = STAINT 이후 스테이트먼트 형식을 사용하여 바이너리 로그에 기록되는 안전하지 않은 스테이트먼트. 다른 테이블에서 선택한 후 자동 검색 열을 사용하여 테이블에 쓰는 스테이트먼트는 안전하지 않습니다. 왜냐하면 행이 검색되는 순서에 따라 기록되는 행이 결정되기 때문입니다(있는 경우).이 순서는 예측할 수 없으며 마스터와 슬레이브에 따라 다를 수 있습니다.
쿼리는 다음과 같습니다.
UPDATE t016sliderimages AS t016
JOIN t004images AS t004
ON t004.ImageID = t016.ImageID
JOIN t034imagealbums AS t034
ON t004.ImageAlbumID = t034.ImageAlbumID
SET t016.SliderNumber = t016.SliderNumber - 1
WHERE t034.ItemID = 32
AND t016.SliderNumber > 4
이것은 잘못된 긍정일 수도 있고, 이 쿼리가 원하는 것을 하고 있는 것처럼 보여도 이 쿼리에 뭔가 문제가 있는 걸까요?
예를 들어 키 값이 1, 2, 3인 테이블이 있고 값이 0에서 시작되도록 하려면 다음과 같이 말할 수 있습니다.set key = key - 1
대부분의 DBMS에서는 이 정도면 충분합니다.그러나 MySQL은 대부분의 DBMS와 다르므로 먼저 ID=3으로 행을 업데이트하려고 시도했다고 가정합니다.1을 빼면 새 ID는 2가 됩니다.그러나 테이블에 ID=2인 행이 이미 있습니다.나쁜 mojojo.
다시 말씀드리지만, 이것은 MySQL에만 적용됩니다(내가 알고 있는).order by
그런 충돌이 일어나지 않도록 말이죠.이 경우 가장 낮은 값으로 시작하고 위로 이동하도록 강제해야 합니다.
SET t016.SliderNumber = t016.SliderNumber - 1
WHERE t034.ItemID = 32
AND t016.SliderNumber > 4
ORDER BY t016.SliderNumber ASC;
그러나 4보다 큰 값부터 시작합니다.위의 첫 번째 값이 5이면 값 = 4. KnoWhaddaMean이 없는지 확인해야 합니다.
업데이트: 이 동작에 대한 참조를 찾았습니다."UPDATE 스테이트먼트에 ORDER BY 절이 포함된 경우"로 시작하는 단락을 찾습니다.."
언급URL : https://stackoverflow.com/questions/29054941/is-this-query-really-unsafe
'programing' 카테고리의 다른 글
Wordpress 사용자 지정기에 "바로 가기 편집" 아이콘을 추가하는 방법 (0) | 2023.02.10 |
---|---|
MS SQL Server의 Oracle "Dual" 테이블과 동등한 것은 무엇입니까? (0) | 2023.02.10 |
클래스 이름과 함께 "this" 사용 (0) | 2023.02.06 |
도커에 동일한 영속 스토리지를 사용하는 2개의 mariadb 인스턴스 (0) | 2023.02.06 |
MariaDB - innodb_log_file_size를 찾을 수 없습니다. (0) | 2023.02.06 |