В чем смысл Prepared Statements MySQL если внешние данные идут в начале в запрос SET?
Таблица у вас удаляется не во время запроса EXECUTE, а уже в строке SET.
Когда подготовленный запрос выполняется из клиента, то в MySQL передаётся не строка в кавычках, а бинарный блок, содержащий тип, длину и значение, подставляемые в плейсхолдер. таким образом прочитав байты, содержащие тип (строка) и длину (36 байт) сервер просто интерпретирует следующие 36 байт как строку главная'; DROP TABLE child;--. Сам запрос к этому времени уже скомпилирован и превращён в последовательность команд, переменные подставляются без анализа их содержимого, так что этот DROP сервер просто не воспримет как команду.
Потому что запросов SET в коде приложения нет. И запросы PREPARE и EXECUTE тоже напрямую не вызываются.
Есть вызовы API, куда сначала в вызов prepare передаётся текст запроса, затем в execute по отдельному бинарному протоколу передаются данные.