CREATE TABLE ASとSELECT INTO


16

PostgreSQLのサポートCREATE TABLE ASSELECT 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 INTOECPGまたは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 OIDSTABLESPACEIF NOT EXISTS)。
  3. SELECT INTO テーブルの作成は「非推奨」です。

補足として、CTEを使用したCTASの構文は少し奇妙に見えるかもしれません。、またQUELを何らかの形で保持するSELECT INTO 場合があります。QUELはSQLの前身であり、PostgreSQL(INGRES)の前身が使用していました。RETRIEVE INTO


1

受け入れられた答えから欠落していることに気づいたもう1つのことがあります。を使用 CREATE TABLE ASすると、各列のnullable属性が保持されますが、この属性は無視されSELECT INTOます。

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

PG 11でこれをテストしたので、おそらくこの質問に答えられて以来の新しい機能です。


長時間実行されるクエリは、テーブルをロックしません。したがって、その理由でCTASを使用する動機は無益です
-a_horse_with_no_name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.