СТВОРИТИ ТАБЛИЦЮ ТА ВИБІРТЕ ДО


16

Підтримка PostgreSQL CREATE TABLE ASі SELECT INTOколи я можу використовувати обоє?

CREATE TABLE AS - визначити нову таблицю з результатів запиту

CREATE TABLE ASстворює таблицю і заповнює її даними, обчисленими SELECTкомандою. У стовпцях таблиці є імена та типи даних, пов’язані з вихідними стовпцями SELECT(за винятком того, що ви можете замінити імена стовпців, надавши явний список нових імен стовпців).

CREATE TABLE ASмає певну схожість із створенням представлення даних, але це насправді зовсім інше: він створює нову таблицю і оцінює запит лише один раз, щоб спочатку заповнити нову таблицю. Нова таблиця не буде відслідковувати наступні зміни у вихідних таблицях запиту. На противагу цьому, перегляд повторно оцінює своє визначальне SELECTвисловлення кожного разу, коли воно запитується.

І потім.

SELECT INTO - визначити нову таблицю з результатів запиту

SELECT INTOстворює нову таблицю і заповнює її даними, обчисленими запитом. Дані клієнту не повертаються, як це стосується звичайного SELECT. Стовпці нової таблиці мають імена та типи даних, пов'язані з вихідними стовпцями SELECT.

Відповіді:


15

Без пояснення завжди використовуйте CREATE TABLE ASбез винятку. У нижній частині кожного під NOTES це очищається,

Примітки для SELECT INTO,

CREATE TABLE ASфункціонально схожий на SELECT INTO. CREATE TABLE ASє рекомендованим синтаксисом, оскільки ця форма SELECT INTOне доступна в ECPG або PL / pgSQL, оскільки вони по-різному інтерпретують пункт INTO. Крім того, CREATE TABLE ASпропонує набір функціональних можливостей, які надає компанія SELECT INTO.

Примітки для CREATE TABLE AS,

Ця команда функціонально схожа на SELECT INTO, але вона є кращою, оскільки її рідше плутати з іншими способами використання SELECT INTOсинтаксису. Крім того, CREATE TABLE ASпропонує набір функціональних можливостей, пропонованих компанією SELECT INTO.

Також у розділі « Сумісність» документівSELECT INTO це іде ще далі,

Стандарт SQL використовує SELECT INTOдля представлення вибору значень у скалярні змінні хост-програми, а не для створення нової таблиці. Це справді використання, знайдене в ECPG (див. Главу 34) та PL / pgSQL (див. Главу 41). Використання PostgreSQL SELECT INTOдля представлення створення таблиць є історичним. Найкраще використовувати CREATE TABLE ASдля цієї мети новий код.

Отже,

  1. PostgreSQL вважає це заплутаним, оскільки SELECT INTO інші речі в контекстах доступні лише в PL / pgSQL та ECPG.
  2. CREATE TABLEпідтримує більше функціональності (я припускаю, що вони посилаються на WITH OIDS, і TABLESPACE, IF NOT EXISTS).
  3. SELECT INTO для створення таблиці "застаріло".

Як бічна примітка, синтаксис CTAS з CTE може виглядати дещо дивно. , а також SELECT INTO може бути якимось затриманням над QUELRETRIEVE INTO . QUEL був попередником SQL, який використовував попередник PostgreSQL (INGRES).


1

Є ще одна річ, яку я помітив, чого немає у прийнятій відповіді. Використання CREATE TABLE ASзбереже нульовий атрибут кожного стовпця, який, здається, ігноруєтьсяSELECT INTO .

Тільки на цій основі я б рекомендував CREATE TABLE AS . Загальний випадок використання обох висловлювань - це завантаження даних із тривалого запиту в таблицю, не блокуючи цю таблицю протягом тривалості вашого запиту. Ви створюєте тимчасову таблицю за допомогою однієї з перерахованих вище команд, поміщаєте туди тривалі результати запитів, а потім вставляєте ці результати в початкову таблицю. Збереження зведеного атрибута у вашій таблиці темп зменшує шанси виходу з ладу другого вставлення.

Випробували це на PG 11, тому, можливо, новіша функція, оскільки відповіли на це питання.


Довгий запущений запит не блокує жодну таблицю. Тож мотивація використовувати CTAS з цієї причини є марною
a_horse_with_no_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.