programing

이 쿼리는 정말 안전하지 않은가요?

goodsources 2023. 2. 6. 23:28
반응형

이 쿼리는 정말 안전하지 않은가요?

다음 쿼리는 원하는 대로 실행되고 있지만 원격 관리 도구(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

반응형