Перейти к содержанию

Именование объектов

В Picodata, благодаря ее реляционной природе, существует большое количество разнообразных объектов:

  • таблицы
  • индексы
  • колонки
  • роли
  • пользователи
  • процедуры
  • и т.д.

Для всех них в SQL-командах выполняются общие правила и ограничения.

Ограничения имен

Имена объектов (таблиц, колонок, ролей, пользователей и т.д.) могут содержать русские и английские буквы во всех регистрах, цифры (но не в начале имени), а также символы дефиса (-, U+2010) и нижнего подчеркивания (_, U+005F). Максимальная длина имени объекта ограничена 65000 байтов (не символов).

Совет

Использование псевдонимов и имен колонок не длиннее 23 байтов существенно повысит производительность планирования распределенного запроса.

Чувствительность к регистру

Если сами команды SQL нечувствительны к регистру (select равнозначен SELECT), то регистр имен объектов имеет значение при условии, что имена заключены в двойные кавычки. То есть, команды create table "warehouse"... и create table "Warehouse"... создадут две разные таблицы.

При разборе SQL содержимое двойных кавычек будет прочитано "как написано". Как следствие, внутри двойных кавычек можно использовать пробелы. В случае наименования без кавычек, имя объекта будет явно приведено в нижний регистр. Например, команды create table WAREHOUSE... и create table "warehouse"... создадут одну и ту же таблицу warehouse.

Поддержка схемы public

Для совместимости со сторонними СУБД, в первую очередь, с PostgreSQL, в Picodata реализована поддержка эфемерной схемы данных public (используется в PostgreSQL по умолчанию).

Имя public можно указать в виде префикса для объектов, находящихся в схеме данных (таблиц, индексов, процедур и т.д.). Примеры равнозначных запросов:

Получение данных таблицы
SELECT * FROM _pico_table;
SELECT * FROM public._pico_table;
Получение данных колонки таблицы
SELECT _pico_table.id FROM _pico_table;
SELECT public._pico_table.id FROM public._pico_table;
Создание процедуры
CREATE PROCEDURE public.proc (int, text, text) AS $$INSERT INTO warehouse VALUES($1, $2, $3)$$;
CREATE PROCEDURE "public".proc(int, text, text) AS $$INSERT INTO warehouse VALUES($1, $2, $3)$$;