Что меняется в правилах обращения к объекту схемы, если его имя совпадает с ключевым словом SQL?
Имя, совпадающее с ключевым словом SQL, обычно можно использовать только как идентификатор с разделителями — в стандартном SQL для этого применяются двойные кавычки. Без кавычек СУБД может трактовать такое слово как часть синтаксиса, поэтому запрос завершится синтаксической ошибкой или будет разобран не так, как ожидается.
Практически лучше переименовать объект, если это возможно: постоянное цитирование ухудшает читаемость, повышает риск ошибок и может осложнить переносимость между СУБД.
SQL одновременно описывает структуру данных и содержит имена команд, типов и других конструкций языка. Поэтому синтаксический анализатор должен отличать имя объекта от ключевого слова, например от слова, обозначающего сортировку, порядок или группу.
Для этого в SQL предусмотрены обычные идентификаторы и идентификаторы с разделителями. Второй механизм позволяет использовать в имени символы или слова, которые нельзя безопасно интерпретировать как обычные идентификаторы.
Предположим, таблица названа словом, которое СУБД использует в синтаксисе. Создание объекта может пройти только при экранированном имени, но последующие запросы, миграции, настройки ORM и ручные операции должны обращаться к нему в том же формате.
Неверное обращение приводит не к отсутствию данных, а часто к ошибке разбора SQL ещё до выполнения запроса. Дополнительный риск связан с регистром: поведение обычных и заключённых в кавычки идентификаторов различается, а конкретные правила нормализации необрамлённых имён зависят от СУБД.
Двойные кавычки в SQL обозначают имя объекта, а не строковый литерал. Внутри них ключевое слово перестаёт восприниматься как команда или часть синтаксической конструкции.
Квалификация sales."order" дополнительно указывает схему и уменьшает неоднозначность поиска объекта. Но квалификация не отменяет необходимость кавычек: sales.order всё равно содержит необрамлённое ключевое слово.
Имена в двойных кавычках обычно сохраняют указанный регистр и требуют последующего обращения с тем же написанием. Необрамлённые идентификаторы СУБД нормализует по своим правилам, поэтому нельзя без проверки переносить предположения о регистре между PostgreSQL, Oracle, MySQL, SQL Server и другими системами.
Есть три практических стратегии:
Ключевое слово может быть зарезервированным или незарезервированным в конкретной реализации. Поэтому список допустимых необрамлённых имён определяется не только стандартом SQL, но и конкретной СУБД и её версией.
В унаследованной базе таблица названа order. Переименование невозможно: десятки приложений и отчётов используют это имя, а изменение контракта потребует синхронного выпуска нескольких сервисов.
Вариант с немедленным переименованием был бы архитектурно чище, но создавал бы большой миграционный риск. Вариант с обращением без кавычек оказался неприемлемым из-за конфликтов с синтаксисом. Поэтому команда оставила физическое имя и закрепила в соглашении обязательное квалифицированное обращение через двойные кавычки, а для новых объектов запретила имена из списка ключевых слов.
Результатом стало предсказуемое выполнение существующих запросов без массовой миграции. Компромисс — дополнительная зависимость от правил конкретной СУБД и необходимость проверять генерацию SQL в ORM и инструментах миграций.
Нет. Одинарные кавычки обозначают строковые литералы, а двойные — идентификаторы с разделителями. Подстановка одинарных кавычек превращает имя объекта в текстовое значение и не решает задачу обращения к таблице или столбцу.
Схема уточняет пространство имён, но не меняет лексический разбор каждой части имени. В записи с квалифицированным именем компонент после точки всё равно должен быть корректным идентификатором; если он совпадает с ключевым словом, его также требуется заключить в двойные кавычки.
Инструмент может генерировать необрамлённые имена, приводить их к другому регистру или сравнивать имена с учётом собственных правил нормализации. В результате объект, созданный как идентификатор с разделителями, не будет найден или будет воспринят как объект с другим именем. Поэтому такие имена нужно проверять на всём пути: создание схемы, миграции, запросы приложения, резервное копирование и аналитические инструменты.