snippetsqlMajor
CREATE TABLE AS vs SELECT INTO
Viewed 0 times
selectintotablecreate
Problem
PostgreSQL supports
And, then.
CREATE TABLE AS and SELECT INTO when do I use both?CREATE TABLE AS -- define a new table from the results of a queryCREATE TABLE AS creates a table and fills it with data computed by a SELECT command. The table columns have the names and data types associated with the output columns of the SELECT (except that you can override the column names by giving an explicit list of new column names).CREATE TABLE AS bears some resemblance to creating a view, but it is really quite different: it creates a new table and evaluates the query just once to fill the new table initially. The new table will not track subsequent changes to the source tables of the query. In contrast, a view re-evaluates its defining SELECT statement whenever it is queried.And, then.
SELECT INTO -- define a new table from the results of a querySELECT INTO creates a new table and fills it with data computed by a query. The data is not returned to the client, as it is with a normal SELECT. The new table's columns have the names and data types associated with the output columns of the SELECT.Solution
Without the explanation, always use
Notes for
Notes for
This command is functionally similar to
Also in the Compatibility section of the docs of
The SQL standard uses
So we have,
As a side note, the syntax for a CTAS with a CTE may look a bit weird., and
CREATE TABLE AS without exception. At the bottom of each under NOTES this is cleared up,Notes for
SELECT INTO,CREATE TABLE AS is functionally similar to SELECT INTO. CREATE TABLE AS is the recommended syntax, since this form of SELECT INTO is not available in ECPG or PL/pgSQL, because they interpret the INTO clause differently. Furthermore, CREATE TABLE AS offers a superset of the functionality provided by SELECT INTO.Notes for
CREATE TABLE AS,This command is functionally similar to
SELECT INTO, but it is preferred since it is less likely to be confused with other uses of the SELECT INTO syntax. Furthermore, CREATE TABLE AS offers a superset of the functionality offered by SELECT INTO.Also in the Compatibility section of the docs of
SELECT INTO it goes even further,The SQL standard uses
SELECT INTO to represent selecting values into scalar variables of a host program, rather than creating a new table. This indeed is the usage found in ECPG (see Chapter 34) and PL/pgSQL (see Chapter 41). The PostgreSQL usage of SELECT INTO to represent table creation is historical. It is best to use CREATE TABLE AS for this purpose in new code.So we have,
- PostgreSQL thinks it's confusing because
SELECT INTOdoes other stuff in contexts only available in PL/pgSQL, and ECPG.
CREATE TABLEsupports more functionality (I assume they're referring toWITH OIDS, andTABLESPACE,IF NOT EXISTS).
SELECT INTOfor table creation is "deprecated".
As a side note, the syntax for a CTAS with a CTE may look a bit weird., and
SELECT INTO may also be some kind of hold over QUEL's RETRIEVE INTO. QUEL was the predecessor to SQL, that the predecessor to PostgreSQL (INGRES) used.Context
StackExchange Database Administrators Q#156105, answer score: 27
Revisions (0)
No revisions yet.