web-dev-qa-db-ja.com

CREATE TABLE AS対SELECT INTO

PostgreSQLは CREATE TABLE AS および SELECT INTO いつ両方を使用するのですか?

CREATE TABLE AS-クエリの結果から新しいテーブルを定義します

CREATE TABLE ASはテーブルを作成し、SELECTコマンドによって計算されたデータをそのテーブルに入力します。テーブルの列には、SELECTの出力列に関連付けられた名前とデータ型があります(ただし、新しい列名の明示的なリストを指定することで列名を上書きできます)。

CREATE TABLE ASは、ビューの作成に似ていますが、実際にはかなり異なります。新しいテーブルを作成し、クエリを評価するだけで、最初に新しいテーブルを埋めます。新しいテーブルは、クエリのソーステーブルに対するその後の変更を追跡しません。対照的に、ビューは、クエリが実行されるたびに、定義しているSELECTステートメントを再評価します。

その後。

SELECT INTO-クエリの結果から新しいテーブルを定義します

SELECT INTO新しいテーブルを作成し、クエリによって計算されたデータをそのテーブルに入力します。通常のSELECTの場合とは異なり、データはクライアントに返されません。新しいテーブルの列には、SELECTの出力列に関連付けられた名前とデータ型があります。

17
Evan Carroll

説明なしで、例外なく常にCREATE TABLE ASを使用してください。各下[〜#〜] notes [〜#〜]の下部で、これはクリアされ、

SELECT INTO のメモ、

CREATE TABLE ASSELECT INTOと機能的に類似しています。この形式のCREATE TABLE ASは、INTO句の解釈が異なるため、ECPGまたはPL/pgSQLでは使用できないため、SELECT INTOが推奨される構文です。さらに、CREATE TABLE ASは、SELECT INTOによって提供される機能のスーパーセットを提供します。

CREATE TABLE AS のメモ、

このコマンドは機能的にはSELECT INTOと似ていますが、SELECT INTO構文の他の使用と混同される可能性が少ないため、推奨されます。さらに、CREATE TABLE ASは、SELECT INTOが提供する機能のスーパーセットを提供します。

また、SELECT INTOのドキュメントのCompatibilityセクションでは、さらに進んでいます。

SQL標準では、SELECT INTOを使用して、新しいテーブルを作成するのではなく、ホストプログラムのスカラー変数に値を選択することを表します。実際、これはECPG(第34章を参照)およびPL/pgSQL(第41章を参照)で見られる使用法です。 テーブル作成を表すためのSELECT INTOのPostgreSQLの使用は歴史的です。新しいコードでこの目的のためにCREATE TABLE ASを使用するのが最善です。

ですから、

  1. PostgreSQLは、SELECT INTOがPL/pgSQLとECPGでのみ利用可能なコンテキストで他のことを行うため、混乱していると考えています。
  2. CREATE TABLEはより多くの機能をサポートしています(WITH OIDSおよびTABLESPACEIF NOT EXISTSを参照していると思います)。
  3. テーブル作成用のSELECT INTOは「非推奨」です。

補足として、CTEを使用した CTASのCTASは少し奇妙に見えるかもしれません。 、およびSELECT INTOmayもある種ホールドオーバー QUEL's RETRIEVE INTO 。 QUELはSQLの前身であり、PostgreSQL(Ingres)の前身が使用していました。

16
Evan Carroll

もう1つ、受け入れられた回答から欠落していることに気付きました。 CREATE TABLE ASを使用すると、SELECT INTOによって無視されているように見える各列のnull許容属性が保持されます。

これだけでも、CREATE TABLE ASをお勧めします。両方のステートメントの一般的な使用例は、クエリの実行中にテーブルをロックせずに、長時間実行クエリからテーブルにデータをロードすることです。上記のコマンドのいずれかを使用して一時テーブルを作成し、長時間実行されるクエリ結果をそこに入れてから、それらの結果を元のテーブルに挿入します。一時テーブルのnull許容属性を保持すると、2番目の挿入が失敗する可能性が低くなります。

PG 11でこれをテストしたため、この質問に対する回答があったため、おそらく新しい機能です。

1
shrumm