SnowConvert AI - PostgreSQL - CREATE TABLE

Translation from PostgreSQL to Snowflake

S’applique à :

  • PostgreSQL

  • Greenplum

  • Netezza

Description

Crée une nouvelle table dans PostgreSQL. Vous définissez une liste de colonnes, chacune contenant des données d’un type distinct. Le propriétaire de la table est l’émetteur de la commande CREATE TABLE.

Pour plus d’informations, reportez-vous à la documentation CREATE TABLE.

Grammar Syntax

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ COMPRESSION compression_method ] [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE source_table [ like_option ... ] }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
    OF type_name [ (
  { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
    PARTITION OF parent_table [ (
  { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]
    | table_constraint }
    [, ... ]
) ] { FOR VALUES partition_bound_spec | DEFAULT }
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]

where column_constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  CHECK ( expression ) [ NO INHERIT ] |
  DEFAULT default_expr |
  GENERATED ALWAYS AS ( generation_expr ) STORED |
  GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters |
  PRIMARY KEY index_parameters |
  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

and table_constraint is:

[ CONSTRAINT constraint_name ]
{ CHECK ( expression ) [ NO INHERIT ] |
  UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters |
  PRIMARY KEY ( column_name [, ... ] ) index_parameters |
  EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
  FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

and like_option is:

{ INCLUDING | EXCLUDING } { COMMENTS | COMPRESSION | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }

and partition_bound_spec is:

IN ( partition_bound_expr [, ...] ) |
FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] )
  TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal, REMAINDER numeric_literal )

index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:

[ INCLUDE ( column_name [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) ]
[ USING INDEX TABLESPACE tablespace_name ]

exclude_element in an EXCLUDE constraint is:

{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

referential_action in a FOREIGN KEY/REFERENCES constraint is:

{ NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] }

Options de tables

TEMPORARY | TEMP, ou IF NOT EXISTS

Hint

Cette syntaxe est entièrement prise en charge par Snowflake.

GLOBAL | LOCAL

Note

Cette syntaxe n’est pas nécessaire dans Snowflake.

Selon la documentation de PostgreSQL, GLOBAL | LOCAL sont présents pour la Compatibilité standard SQL, mais n’ont aucun effet dans PostgreSQL et sont obsolètes. C’est pourquoi, SnowConvert AI supprimera ces fonctions clés au cours du processus de migration.

Source d’exemple

Code d’entrée :

PostgreSQL
CREATE GLOBAL TEMP TABLE TABLE1 (
   COL1 integer
);

Code de sortie :

Snowflake
CREATE TEMPORARY TABLE TABLE1 (
   COL1 integer
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "05/09/2025",  "domain": "no-domain-provided" }}';

UNLOGGED TABLE

Note

Cette syntaxe n’est pas nécessaire dans Snowflake.

Les tables UNLOGGED offrent un avantage significatif en termes de vitesse, car elles ne sont pas écrites dans le journal d’écriture anticipée. Snowflake ne prend pas en charge cette fonctionnalité, de sorte que la clause UNLOGGED sera commentée.

Exemple de code

Code d’entrée :

Greenplum
CREATE UNLOGGED TABLE TABLE1 (
  COL1 integer
);

Code de sortie :

Snowflake
CREATE
--       --** SSC-FDM-PG0005 - UNLOGGED TABLE IS NOT SUPPORTED IN SNOWFLAKE, DATA WRITTEN MAY HAVE DIFFERENT PERFORMANCE. **
--       UNLOGGED
                TABLE TABLE1 (
   COL1 integer
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "05/09/2025",  "domain": "no-domain-provided" }}';

Attributs des colonnes

Attribut CHECK

Hint

This syntax is supported in Snowflake for deterministic, scalar expressions.

The CHECK clause specifies an expression producing a Boolean result that new or updated rows must satisfy for an insert or update operation to succeed. Snowflake supports CHECK constraints with deterministic, scalar expressions. Unsupported expressions (UDFs, non-deterministic functions) are flagged with SSC-EWI-0116.

Supported:

  • Basic CHECK constraints with scalar, deterministic expressions

  • Column-level and table-level CHECK constraints

  • Named and unnamed constraints

Unsupported (flagged with SSC-EWI-0116):

  • User-defined functions (UDFs)

  • Non-deterministic built-in functions

  • Context-dependent functions (e.g., CURRENT_TIMESTAMP, CURRENT_USER, NOW())

  • Subqueries

Grammar Syntax

CHECK  ( <expression> )

Source d’exemple

Example 1: Basic CHECK Constraint (Supported)

Code d’entrée :

PostgreSQL
CREATE TABLE products (
    product_id INT PRIMARY KEY,
    price NUMERIC(10,2) CHECK (price > 0),
    quantity INT CHECK (quantity >= 0 AND quantity <= 1000)
);

Code de sortie :

Snowflake
CREATE OR REPLACE TABLE products (
    product_id INT PRIMARY KEY,
    price NUMERIC(10, 2) CHECK (price > 0),
    quantity INT CHECK (quantity >= 0
    AND quantity <= 1000)
)
;
Example 2: Named Table-Level CHECK Constraint

Code d’entrée :

PostgreSQL
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    birth_date DATE,
    hire_date DATE,
    CONSTRAINT chk_dates CHECK (hire_date >= birth_date)
);

Code de sortie :

Snowflake
CREATE OR REPLACE TABLE employees (
    employee_id INT PRIMARY KEY,
    birth_date DATE,
    hire_date DATE,
    CONSTRAINT chk_dates CHECK(hire_date >= birth_date)
)
;

GENERATED BY DEFAULT AS IDENTITY

Hint

Cette syntaxe est entièrement prise en charge par Snowflake.

Spécifie que la colonne est une colonne IDENTITY par défaut et vous permet d’attribuer automatiquement une valeur unique à la colonne.

Grammar Syntax

 GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( <sequence_options> ) ]

Source d’exemple

Code d’entrée :

PostgreSQL
CREATE TABLE table1 (
idValue INTEGER GENERATED ALWAYS AS IDENTITY)

Code de sortie :

Snowflake
CREATE TABLE table1 (
idValue INTEGER IDENTITY(1, 1) ORDER
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "05/09/2025",  "domain": "no-domain-provided" }}'

Contraintes de tables

Clé primaire, clé étrangère et unique

Avertissement

Cette syntaxe est partiellement prise en charge par Snowflake.

SnowConvert AI conserve les définitions des contraintes ; cependant, dans Snowflake, les clés uniques, primaires et étrangères sont utilisées pour la documentation et n’appliquent pas de contraintes ou d’unicité. Elles aident à décrire les relations entre les tables, mais n’ont pas d’impact sur l’intégrité ou la performance des données.

Attributs de la table

Option LIKE

Avertissement

Cette syntaxe est partiellement prise en charge par Snowflake.

La clause LIKE spécifie une table à partir de laquelle la nouvelle table copie automatiquement tous les noms de colonnes, leurs types de données et leurs contraintes non nulles. PostgreSQL prend en charge plusieurs options, alors que Snowflake ne le fait pas et SnowConvert AI supprimera ces options.

Grammar Syntax

  LIKE source_table { INCLUDING | EXCLUDING }
  { AM | COMMENTS | CONSTRAINTS | DEFAULTS | ENCODING | GENERATED | IDENTITY | INDEXES | RELOPT | STATISTICS | STORAGE | ALL }

Modèles d’échantillons de sources

Code d’entrée :

PostgreSQL
CREATE TABLE source_table (
    id INT,
    name VARCHAR(255),
    created_at TIMESTAMP,
    status BOOLEAN
);

CREATE TABLE target_table_no_constraints (LIKE source_table INCLUDING DEFAULTS EXCLUDING CONSTRAINTS EXCLUDING INDEXES);

Code de sortie :

Snowflake
CREATE TABLE source_table (
    id INT,
    name VARCHAR(255),
    created_at TIMESTAMP,
    status BOOLEAN
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "05/12/2025",  "domain": "no-domain-provided" }}';
CREATE TABLE target_table_no_constraints LIKE source_table;

ON COMMIT

Avertissement

Cette syntaxe est partiellement prise en charge.

Spécifie le comportement de la table temporaire lorsqu’une validation est effectuée.

Grammar Syntax

ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }

Modèles d’échantillons de sources

Code d’entrée :

PostgreSQL

CREATE GLOBAL TEMPORARY TABLE temp_data_delete (
    id INT,
    data TEXT
) ON COMMIT DELETE ROWS;

Code de sortie :

Snowflake
CREATE TEMPORARY TABLE temp_data_delete (
    id INT,
    data TEXT
)
----** SSC-FDM-0008 - ON COMMIT NOT SUPPORTED **
--ON COMMIT DELETE ROWS
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "postgresql",  "convertedOn": "05/12/2025",  "domain": "no-domain-provided" }}';

PARTITION BY, USING, TABLESPACE, et WITH

Note

Cette syntaxe n’est pas nécessaire dans Snowflake.

Ces clauses dans Snowflake ne sont pas nécessaires car elles gèrent automatiquement le stockage de données, contrairement à PostgreSQL, qui peut être configuré manuellement. Pour cette raison, ces clauses sont supprimées lors de la migration.