PostgreSQLは CREATE TABLE AS
および SELECT INTO
いつ両方を使用するのですか?
CREATE TABLE AS
-クエリの結果から新しいテーブルを定義します
CREATE TABLE AS
はテーブルを作成し、SELECT
コマンドによって計算されたデータをそのテーブルに入力します。テーブルの列には、SELECT
の出力列に関連付けられた名前とデータ型があります(ただし、新しい列名の明示的なリストを指定することで列名を上書きできます)。
CREATE TABLE AS
は、ビューの作成に似ていますが、実際にはかなり異なります。新しいテーブルを作成し、クエリを評価するだけで、最初に新しいテーブルを埋めます。新しいテーブルは、クエリのソーステーブルに対するその後の変更を追跡しません。対照的に、ビューは、クエリが実行されるたびに、定義しているSELECT
ステートメントを再評価します。
その後。
SELECT INTO
-クエリの結果から新しいテーブルを定義します
SELECT INTO
新しいテーブルを作成し、クエリによって計算されたデータをそのテーブルに入力します。通常のSELECT
の場合とは異なり、データはクライアントに返されません。新しいテーブルの列には、SELECT
の出力列に関連付けられた名前とデータ型があります。
説明なしで、例外なく常にCREATE TABLE AS
を使用してください。各下[〜#〜] notes [〜#〜]の下部で、これはクリアされ、
SELECT INTO
のメモ、
CREATE TABLE AS
はSELECT 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
を使用するのが最善です。
ですから、
SELECT INTO
がPL/pgSQLとECPGでのみ利用可能なコンテキストで他のことを行うため、混乱していると考えています。CREATE TABLE
はより多くの機能をサポートしています(WITH OIDS
およびTABLESPACE
、IF NOT EXISTS
を参照していると思います)。SELECT INTO
は「非推奨」です。補足として、CTEを使用した CTASのCTASは少し奇妙に見えるかもしれません。 、およびSELECT INTO
mayもある種ホールドオーバー QUEL's RETRIEVE INTO
。 QUELはSQLの前身であり、PostgreSQL(Ingres)の前身が使用していました。
もう1つ、受け入れられた回答から欠落していることに気付きました。 CREATE TABLE AS
を使用すると、SELECT INTO
によって無視されているように見える各列のnull許容属性が保持されます。
これだけでも、CREATE TABLE AS
をお勧めします。両方のステートメントの一般的な使用例は、クエリの実行中にテーブルをロックせずに、長時間実行クエリからテーブルにデータをロードすることです。上記のコマンドのいずれかを使用して一時テーブルを作成し、長時間実行されるクエリ結果をそこに入れてから、それらの結果を元のテーブルに挿入します。一時テーブルのnull許容属性を保持すると、2番目の挿入が失敗する可能性が低くなります。
PG 11でこれをテストしたため、この質問に対する回答があったため、おそらく新しい機能です。