Я не можу знайти документацію, яка описує дійсні формати імені схеми PostgreSQL. Я знаю, що назва схеми не може:
- Почніть з числа
- мати пробіли
- починати з
pg_
Що ще? Куди мені шукати?
Я не можу знайти документацію, яка описує дійсні формати імені схеми PostgreSQL. Я знаю, що назва схеми не може:
pg_Що ще? Куди мені шукати?
Відповіді:
Згідно з тонкою документацією , я думаю, це може бути те, що ви шукаєте.
Ідентифікатори SQL та ключові слова повинні починатися з літери (az, але також букв із діакритичними позначками та не латинськими літерами) або підкреслення (_). Наступними символами в ідентифікаторі або ключовому слові можуть бути літери, підкреслення, цифри (0-9) або знаки долара ($). Зауважте, що знаки долара не дозволяються в ідентифікаторах відповідно до букви стандарту SQL, тому їх використання може зробити програми менш портативними ...
pg_підкреслення в зв'язку з цим, як Nathan C згадано .
Згідно з документацією , вона також не може починатися з pg_того, що зарезервовано. Крім цього, це виглядає досить вільно.
this-is schemaі все одно це буде невірним ім'ям схеми.
Правильна відповідь - це та, яку надають gsiems. Однак хочу зазначити, що PostgreSQL має правила щодо котируваних ідентифікаторів, які ви можете пам’ятати. "Котирувані ідентифікатори можуть містити будь-який символ, крім символу з кодом нуля. (Щоб включити подвійну лапочку, напишіть дві подвійні лапки.)" ... Існують також деякі обмеження на випадок, який ви хочете подивитися.
Тож якщо ви збираєтесь цитувати свої ідентифікатори, то ви можете використовувати будь-який символ, який ви хочете (за винятком \ 0). Але якщо ви не цитуєте своїх ідентифікаторів, ви повинні дотримуватися правил, викладених на цій сторінці.
Я хотів би вказати на це головним чином тому, що раніше мене покусало, особливо правила, що стосуються випадку в нецитованих ідентифікаторах (а назви схем вважаються ідентифікаторами).
ОНОВЛЕННЯ:
Як приклад (не застосовується спеціально до ідентифікаторів схем, але однаково застосовно до них):
DROP TABLE "tbluser"; -- assuming it exists
DROP TABLE "TBLUSER"; -- assuming it exists; incidentally, they are two different tables
CREATE TABLE "TBLUSER" ( username text );
INSERT INTO "TBLUSER" VALUES ( 'joe' );
SELECT * FROM TBLUSER; -- this returns an error that the tbluser relation does not exist
SELECT * FROM "TBLUSER"; -- works fine
Це може бути очікуваною поведінкою для тих, хто має досвід PostgreSQL (і, можливо, стандартів SQL), але хтось, хто не знайомий з PG і з точки зору інших серверів баз даних (наприклад, SQL Server або Oracle), може натрапити на цю поведінку і цікаво, чому таблиця, яку вони тільки що створили, відсутня.
Можливо, деякі посібники рекомендують забороняти використовувати котирувані ідентифікатори, але справа в тому, що цитовані ідентифікатори доступні для використання та можуть бути використані. Крім того, багато пакунків передбачають політику завжди використовувати котирувані ідентифікатори під час створення та доступу до відносин, які не є повністю малі, наприклад, PGAdmin III.
Наприклад, це сценарій, створений PGAdmin III при створенні таблиці через інтерфейс користувача:
CREATE TABLE public."TBLUSER"
(
username text
)
WITH (
OIDS = FALSE
)
;
Отже, єдиний спосіб, коли користувач може отримати доступ до цієї таблиці в запиті, - звернувшись до свого котируваного ідентифікатора, тобто "TBLUSER". Спроба отримати доступ до цієї таблиці у запиті з нецитованим ідентифікатором призведе до невдалого пошуку відношення, тобто TBLUSER.