Ответ на то, что я хотел знать, - нет.Первичный ключ не требуется в списке проекций, эффект UPDATE
такой же, даже если o.order_id
не выбран в подзапросе.Однако это не означает, что первичный ключ не используется, благодаря декларативной технике.Независимо от того, включен или исключен первичный ключ, создается тот же план выполнения для извлечения записей, которые будут обновлены:
Проекция не сильно меняетсяздесь СУБД может идентифицировать каждую строку после операции хеширования, см. ответ Крокодилко.
Если вы ничего не выберете из таблицы (например, введите SELECT 1 FROM ...
), вы не сможете выполнить обновлениекоманда, результат подзапроса - это просто обычный набор некоторых данных, который не может быть сопоставлен с таблицей.
Я думаю, что мы всегда должны включать первичный ключ, чтобы было понятно читателю, какрезультат подзапроса, используемый во внутреннем запросе, таблицу, которую мы планируем обновить.