UTWÓRZ TABELĘ JAKO WYBIERZ W

16

Obsługa PostgreSQL CREATE TABLE ASi SELECT INTOkiedy korzystać z obu?

CREATE TABLE AS - zdefiniuj nową tabelę na podstawie wyników zapytania

CREATE TABLE AStworzy tabelę i wypełnia ją danymi obliczonymi przez SELECTpolecenie. Kolumny tabeli mają nazwy i typy danych powiązane z kolumnami wyjściowymi SELECT(z wyjątkiem tego, że można zastąpić nazwy kolumn, podając jawną listę nazw nowych kolumn).

CREATE TABLE ASjest trochę podobny do tworzenia widoku, ale jest naprawdę całkiem inny: tworzy nową tabelę i ocenia zapytanie tylko raz, aby początkowo wypełnić nową tabelę. Nowa tabela nie będzie śledzić kolejnych zmian w tabelach źródłowych zapytania. Natomiast widok ponownie ocenia swoją definicję SELECTinstrukcji za każdym razem, gdy jest pytany.

I wtedy.

SELECT INTO - zdefiniuj nową tabelę na podstawie wyników zapytania

SELECT INTOtworzy nową tabelę i wypełnia ją danymi obliczonymi przez zapytanie. Dane nie są zwracane do klienta, tak jak w przypadku normalnego SELECT. Kolumny nowej tabeli mają nazwy i typy danych powiązane z kolumnami wyjściowymi pliku SELECT.

Evan Carroll
źródło

Odpowiedzi:

15

Bez wyjaśnienia zawsze używaj CREATE TABLE AS bez wyjątku. U dołu każdego pod UWAGI jest to wyjaśnione,

Uwagi do SELECT INTO ,

CREATE TABLE ASjest funkcjonalnie podobny do SELECT INTO. CREATE TABLE ASjest zalecaną składnią, ponieważ ta forma SELECT INTOnie jest dostępna w ECPG ani PL / pgSQL, ponieważ interpretują klauzulę INTO w różny sposób. Ponadto CREATE TABLE ASoferuje nadzbiór funkcjonalności zapewnianej przezSELECT INTO .

Uwagi do CREATE TABLE AS ,

To polecenie jest funkcjonalnie podobne do SELECT INTO, ale jest preferowane, ponieważ jest mniej prawdopodobne, że zostanie pomylone z innymi zastosowaniami SELECT INTOskładni. Ponadto CREATE TABLE ASoferuje nadzbiór funkcji oferowanych przez SELECT INTO.

Również w dziale Zgodność dokumentów tego dokumentu SELECT INTOidzie jeszcze dalej,

Standard SQL używa SELECT INTOdo reprezentowania wybierania wartości do zmiennych skalarnych programu hosta zamiast tworzenia nowej tabeli. Jest to rzeczywiście zastosowanie w ECPG (patrz Rozdział 34) i PL / pgSQL (patrz Rozdział 41). Wykorzystanie PostgreSQL SELECT INTOdo tworzenia tabel jest historyczne. Do CREATE TABLE AStego celu najlepiej używać nowego kodu.

Więc mamy,

  1. PostgreSQL uważa, że ​​jest to mylące, ponieważ SELECT INTOrobi inne rzeczy w kontekstach dostępnych tylko w PL / pgSQL i ECPG.
  2. CREATE TABLEobsługuje więcej funkcji (zakładam, że odnoszą się do WITH OIDS, i TABLESPACE, IF NOT EXISTS).
  3. SELECT INTO tworzenie tabeli jest „przestarzałe”.

Na marginesie, składnia CTAS z CTE może wyglądać nieco dziwnie. , i SELECT INTO może być także pewnym rodzajem kontroli nad QUELRETRIEVE INTO . QUEL był poprzednikiem SQL, którego używał poprzednik PostgreSQL (INGRES).

Evan Carroll
źródło
1

Zauważyłem jeszcze jedną rzecz, której brakuje w zaakceptowanej odpowiedzi. Użycie CREATE TABLE ASzachowuje atrybut zerowalny każdej kolumny, który wydaje się ignorowany przez SELECT INTO.

Tylko na tej podstawie polecam CREATE TABLE AS . Częstym przypadkiem użycia obu instrukcji jest ładowanie danych z długo działającego zapytania do tabeli bez blokowania tej tabeli na czas trwania zapytania. Stwórz tabelę tymczasową za pomocą jednego z powyższych poleceń, umieść tam wyniki długotrwałego zapytania, a następnie wstaw te wyniki do oryginalnej tabeli. Zachowanie atrybutu zerowalnego w tabeli tymczasowej zmniejsza ryzyko niepowodzenia drugiej wstawki.

Testowałem to na PG 11, więc być może jest to nowsza funkcja od czasu odpowiedzi na to pytanie.

skurczyć
źródło
Długotrwałe zapytanie nie blokuje żadnej tabeli. Dlatego motywacja do korzystania z CTAS z tego powodu jest daremna
a_horse_with_no_name