CREATE TABLE

Nombre

CREATE TABLE -- define una nueva tabla

Sinopsis

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE nombre_tabla ( [ 
    { nombre_columna tipo_datos [ DEFAULT expresión_predeterminada ] [ restricción_columna [ ... ] ] 
    | restricción_tabla
    | LIKE tabla_padre [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ] ... } 
[,  ... ] 
] ) 
[ INHERITS ( tabla_padre  [,  ... ] ) ] 
[ WITH ( parámetro_almacenamiento [= valor] [,  ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE espacio_tabla ]

donde restricción_columna es:

[ CONSTRAINT nombre_restricción ]
{ NOT NULL | 
  NULL |  
  UNIQUE parámetros_indice | 
  PRIMARY KEY parámetros_indice | 
  CHECK ( expresión ) | 
  REFERENCES tabla_referenciada [ ( columna_referenciada ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] 
    [ ON DELETE acción ] [ ON UPDATE acción ] } 
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 

y restricción_tabla es: 

[ CONSTRAINT nombre_restricción  ] 
{ UNIQUE ( nombre_columna [,  ... ] ) parámetros_indice | 
  PRIMARY KEY ( nombre_column [,  ... ] ) parámetros_indice | 
  CHECK ( expresión ) | 
  FOREIGN KEY ( nombre_columna [,  ... ] ) REFERENCES tabla_referenciada [ ( columna_referenciada  [,  ... ] ) ] 
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } 
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 

parámetros_indice en restricciones UNIQUE y PRIMARY KEY son:

[ WITH ( parámetro_almacenamiento [= valor] [,  ... ] ) ]
[ USING INDEX TABLESPACE espacio_tabla ]

Descripción

CREATE TABLE creará una tabla nueva, inicialmente vacía, en la base de datos actual. La tabla será propiedad del usuario que ejecuta la orden.

Si un nombre de esquema es dado (por ejemplo, CREATE TABLE mi_esquema.mi_tabla ...) entonces la tabla se crea en el esquema especificado. De lo contrario, es creada en el esquema actual. Tablas temporales existen en un esquema especial, por lo que no puede darse un nombre de esquema al crear una tabla temporal. El nombre de la tabla debe ser distinto al nombre de cualquier otra tabla, secuencia, índice, o vista en el mismo esquema.

También CREATE TABLE crea automáticamente el tipo de datos que representa el tipo compuesto correspondiente a una fila de la tabla. Por lo tanto, las tablas no pueden tener el mismo nombre que ningún tipo de datos existente en el mismo esquema.

Las clausulas opciones de restricción especifican pruebas (restricciones) que las filas nuevas o actualizadas deben satisfacer para que una inserción o actualización sea satisfactoria. Una restricción es un objeto SQL que ayuda a definir un conjunto de valores válidos en la tabla de varias formas.

Hay dos formas de definir restricciones: de tabla y de columna. Una restricción de columna es especificada como parte de la definición de columna. Una restricción de tabla no se asocia a una columna particular, y pude abarcar más de una columna. Cada restricción de columna puede ser también escrita como restricción de tabla; una restricción de columna es solo una notación conveniente para restricciones que afectan una sola columna.

Parámetros

TEMPORARY o TEMP
Si se especifica, la tabla es creada como una tabla temporal. Las tablas Temporales se eliminan automáticamente al terminar la sesión, o opcionalmente al finalizar la transacción actual (ver ON COMMIT abajo). Las tablas permanentes existentes con el mismo nombre no son visibles a la ssión actual mientras la tabla temporal exista, salvo que sean referenciadas con nombres calificados por el esquema. Cualquier indice creado en una tabla temporal también son temporales de la misma manera.

Opcionalmente, GLOBAL o LOCAL pueden ser escrito antes de TEMPORARY o TEMP. Esto no hace diferencia en PostgreSQL, pero ver  Compatibilidad.

nombre_tabla
El nombre (opcionalmente calificado por el esquema) de la tabla a ser creada.
nombre_columna
El nombre de la columna a crear en la nueva tabla.
tipo_datos
El tipo de datos de la columna. Puede incluir identificadores de arreglos. Para más información sobre los tipos de datos soportados por PostgreSQL, referirse a  Capitulo 8.
DEFAULT expresión_predeterminada
La clausula DEFAULT asigna un valor de dato por defecto para la columna en la cual se especifica. El valor es cualquier expresión libre de variables (subconsultas y referencias cruzadas a otras columnas en la tabla actual no son permitidos). El tipo de datos de la expresión predeterminada debe coincidir con el tipo de datos de la columna.

La expresión predeterminada será usada en cualquier operación de inserción que no especifique el valor para la columna. Si no hay valor predeterminado para una columna, entonces el valor por defecto es NULL.

INHERITS ( tabla_padre [, ... ] )
La clausula opcional INHERITS especifica una lista de tablas de las cuales la nueva tabla heredará automáticamente todas las columnas.

El uso de INHERITS crea una interrelación persistente entre la nueva tabla hija y sus tabla(s) padre. Modificaciones al esquema en los padre(s) normalmente se propagan a las hijas, y por defecto los datos de las tablas hijas es incluida en las busquedas de los padre(s).

Si existe el mismo nombre de columna en más de una tabla padre, un error es reportado salvo que los tipos de datos de las columnas coincidan en cada tabla padre. Si no hay conclicto, las columnas duplicadas son unificadas para formar una columna individual en la tabla hija. Si en el listado de nombres de columnas de la nueva tabla contiene un nombre de columna que es también heredado, el tipo de datos debe coinicidir con la columna heredada, y las definiciones de columnas son unificadas en una. Si la nueva tabla explicitamente especifica un valor por defecto para la columna, este valor por defecto reemplaza cualquiera heredado desde declaraciones de columnas. De lo contrario, deben coincidir las especificaciones de valores por defecto para las columnas de los padres, o un error será reportado.

Las restricciones CHECK son unificadas esencialmente del mismo modo que las columnas: si múltiples tablas padre y/o la nueva definición de tabla tienen restricciones CHECK nombradas idénticamente, estas restricciones deben todas contener la misma expresión de comprobación, o un error será reportado. Restricciones que tienen el mismo nombre y expresión serán unificadas en una sola copia. Notar que una restricción CHECK sin nombre en una nueva tabla nunca será unificada, dado que un nombre único será elegido siempre para ella.

LIKE tabla_padre [ { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES } ]
La clausula LIKE especifica una tabla desde la cual la nueva tabla automáticamente copia todos los nombres de columna, sus tipos de datos y sus restricciones no-nulas.

A diferencia de INHERITS, la nueva tabla y la original son totalmente desacopladas luego que la creación sea completada. Los cambios a la tabla original no serán aplicados a las nuevas tablas, y no es posible incluir datos de la nueva tabla en búsquedas de la tabla original.

Las expresiones predeterminadas de la columna copiada serán copiadas sólo si se especifica INCLUDING DEFAULTS. El comportamiento por defecto es excluirlas, resultando en que las columnas copiadas en la nueva tabla tengan valores predeterminados nulos.

Las restricciones no-nulasson copiadas siempre a la nueva tabla. Las restricciones CHECK se copiarán solo si se especifica INCLUDING CONSTRAINTS; otros tipos de restricciones nunca se copiarán. A su vez, no se hace distinción entre las restricciones de columna y las restricciones de tabla - cuando las restricciones son requeridas, todas las restricciones de chequeo son copiadas.

Cualquier indice en la tabla original no será creado en la nueva tabla, salvo que se especifique la clausula INCLUDING INDEXES.

Notar también que a diferencia de INHERITS, las columnas y restricciones copiadas no son unificadas con sus similares. Si el mismo nombre es especificado explícitamente o en otra clausula LIKE, un error es reportado.

CONSTRAINT nombre_restricción
Un nombre de opcional de restricción de columna o tabla. Si la restriccion es violada, su nombre se presenta en el mensaje de error, por lo que nombres de restricciones similares a col debe ser positiva pueden ser usadas para comunicar información útil a aplicaciones clientes. (Comillas dobles son necesarias para especificar nombres de restricciones que contengan espacios.) Si un nombre de restricción no es especificada, el sistema genera un nombre.
NOT NULL
No es permitido que la columna contenga valores nulos.
NULL
Se permite que la columna permita contener valores nulos. Este es el comportamiento por defecto.

Esta clausula solo se provee para compatibilidad con bases de datos SQL no estándar. Su uso es desaconsejado en aplicaciones nuevas.

UNIQUE (restricción de columna) / UNIQUE ( nombre_columna [, ... ] ) restricción de tabla)
La restricción UNIQUE especifica que un grupo de una o más columnas de una tabla pueden contener solo valores únicos. El comportamiento de la restricción única de tabla es el mismo que el de la restricción de columna, con la capacidad adicional de abarcar columnas múltiples.

Para el propósitos una restricción única, los valores nulos no son considerados iguales.

Cada restricción única debe nombrar un conjunto de columnas que es diferente del conjunto de columnas nombrado por otra restricción única o restricción de clave primaria definida par ala tabla. (De lo contrario será solo la misma restricción listada dos veces.)

PRIMARY KEY (restricción de columna) / PRIMARY KEY ( nombre_columna [, ... ] ) (restricción de tabla)
La restricción de clave primaria especifica que una o varias columnas de una tabla pueden tener valores únicos(no duplicados), sin nulos. Técnicamente, PRIMARY KEY es simplemente una combinación de UNIQUE y NOT NULL, pero identificando un conjunto de columnas como la clave primaria también provee metadatos sobre el diseño del esquema, dado que una clave primaria implica que otras tablas pueden confiar en este conjunto de columnas como un identificador único de las filas.

Solo una clave primaria puede ser especificada para una tabla, ya sea como una restricción de columna o de tabla.

Esta restricción de clave primaria debería nombrar un conjunto de columnas que es diferente de otros conjuntos de columnas nombrados por una restricción única definida en la misma tabla.

CHECK ( expresión )
La clausula CHECK especifica una expresión produciendo un resultado Boolean el cual las filas nuevas o actualizadas deben satisfacer para que una operación de actualización o inserción sea exitosa. Expresiones evaluando a TRUE o UNKNOWN tienen éxito. En el caso que cualquier fila de operación de inserción o actualización produzca un resultado FALSE, una excepción de error es lanzada y la actualización o inserción no altera la base de datos. Una restricción de chequeo especificada como una restricción de columna debería referenciarse solo al valor de dicha columna, mientras que una expresión apareciendo en una restricción de tabla puede referenciar múltiples columnas.

Actualmente, las expresiones CHECK no pueden contener subconsultas ni referirse a variables más que a las columnas de la fila actual.

REFERENCES tabla_referenciada [ ( columna_referenciada ) ] [ MATCH tipo_coincidencia ] [ ON DELETE acción ] [ ON UPDATE acción ] (restricción de columna) / FOREIGN KEY ( columna [, ... ] ) REFERENCES tabla_referenciada [ ( columna_referenciada [, ... ] ) ] [ MATCH tipo_coincidencia ] [ ON DELETE acción ] [ ON UPDATE acción ] (restricción de consulta)
Esta clausula especifica una restricción de llave foránea, la cual requiere que un grupo de una o más columnas de la nueva tabla deban contener valores solamente que coincidan con los de las columna(s) referenciadas de la misma fila de la tabla referenciada. Si columna_referenciada es omitida, la clave primaria de la tabla_referenciada es usada. Las columnas referenciadas deben ser las columnas de una restricción única o de clave primaria en la tabla referenciada. Notar que las restricciones de llaves foráneas no pueden ser definidas entre tablas temporales y tablas permanentes.

Un valor insertado en la(s) columna(s) referenciada(s) es comparado contra los valores de las columnas de la tabla referenciada usando el tipo de coincidencia dado. Hay tres tipos de coincidencias: MATCH FULL, MATCH PARTIAL, y MATCH SIMPLE, el cual es lo predeterminado. MATCH FULL no permitirá que una columna de una clave foránea multicolumna sea nulo salvo que todas las columnas de la llave foránea sean nulas. MATCH SIMPLE permite que algunas columnas de la llave foránea sea nula mientras que otras partes de la llave foránea sean no nulas. MATCH PARTIAL no está aún implementado.

Adicionalmente, cuando los datos en las columnas referenciadas son modificados, ciertas acciones son realizadas en los datos en las columnas de esta tabla (que los referencia). La clausula ON DELETE especifica que la acción a realizar cuando la fila referenciada en la tabla referenciada esta siendo eliminada. Del mismo modo, la clausula ON UPDATE especifica la acción a realizar cuando una columna en la tabla referenciada esta siendo actualizada a un nuevo valor. Si la fila es actualizada, pero la columna referenciada no es realmente modificada, no se hace ninguna acción. Acciones referenciales otras que chequeos NO ACTION no pueden ser diferidos, incluso si la restricción es declarada diferible. Existen las siguientes acciones posibles para cada clausula:

NO ACTION
Produce un error indicando que la eliminación o actualización crearía una violación de la restricción de llave foránea. Si la restricción es diferida, este error será producido en el momento de chequeo de la restricción si aún existe alguna fila referenciada. Esta es la acción por defecto.
RESTRICT
Produce un error indicando que la eliminación o actualización crearía una violación de la restricción de llave foránea. Esto es lo mismo que NO ACTION excepto que este chequeo no es diferible.
CASCADE
Elimina cualquier fila referenciando la fila eliminada, o actualiza el valor de la columna referenciando al nuevo valor de la columna referenciada, respectivamente.
SET NULL
Establece la(s) columna(s) column(s) referenciando a nulo.
SET DEFAULT
Establece la(s) columna(s) referenciando a sus valores por defecto.

Si la(s) columna(s) referenciada(s) son modificadas frecuentemente, puede ser podría ser prudente agregar un índice a la columna de llave foránea así las acciones referenciales asociadas con la clave foránea podrían ser realizadas más eficientemente.

DEFERRABLE / NOT DEFERRABLE
Controla cuando la restricción puede ser diferida. Una restricción que no pude ser diferible será comprobada inmediatamente después de cada comando. La comprobación de las restricciones que son diferibles pueden ser pospuestas hasta el final de la transacción (usando el comándo  SET CONSTRAINTS). NOT DEFERRABLE es lo predeterminado. Solo las restricciones de llaves foráneas actualmente aceptan esta clausula. Todos los otros tipos de restricciones no son diferibles.
INITIALLY IMMEDIATE / INITIALLY DEFERRED
Si una restricción es diferible, esta clausula especifica que el momento predeterminado para comprobar la restricción. Si la restricción es INITIALLY IMMEDIATE, es comprobada después de cada sentencia. Este es lo predeterminado. Si la restricción es INITIALLY DEFERRED, es comprobada solo al final de la transacción. El momento de la comprobación de la restricción puede ser alterado con el comando  SET CONSTRAINTS.
WITH ( parámetro_almacenamiento [= valor] [, ... ] )
Esta clausula especifica parámetros de almacenamiento opcionales para la tabla o índice; ver Parámetros de Almacenamiento para más información. La clausula WITH para una tabla puede también incluir OIDS=TRUE (o simplemente OIDS) para especificar que las filas de la nueva tabla deberían tener OIDs (identificadores de objeto) asignados a ellos, o OIDS=FALSE para especificar que las filas no deberían tener OIDs. Si no se especifica OIDS, el ajuste predeterminado depende del parámetro de configuración  default_with_oids. (Si la nueva tabla hereda de cualquier otra tabla que tengan OIDs, entonces se fuerza OIDS=TRUE aún si el comando dice OIDS=FALSE.)

Si se especifica o esta implícito OIDS=FALSE, la nueva tabla no almacena OIDs y ningún OID será asignado para una fila insertada en ella. Esto es considerado en beneficioso en general, dado que reducirá la consumición de OID y de este modo pospondrá el reciclo (wraparound) del contador OID. Una vez que el contador completa un ciclo (wraps around), los OIDs no pueden ser más asumidos como únicos, lo que los hace considerablemente menos útiles. Adicionalmente, excluyendo los OIDs de una tabla reduce el espacio requerido para almacenar la tabla en el disco por 4 bytes por fila (en la mayoría de los equipos), mejorando ligeramente el rendimiento.

Para eliminar el OIDs de una tabla luego que ha sido creada, usar  ALTER TABLE.

WITH OIDS / WITHOUT OIDS
Estas son sintaxis obsoletas equivalentes a WITH (OIDS) y WITH (OIDS=FALSE), respectivamente. Si desea dar tanto un ajuste OIDS y un parámetro de almacenamiento, debe usar la sintaxis WITH ( ... ); ver arriba.
ON COMMIT
El comportamiento de las tablas temporales al final del bloque de transacción pueden ser controladas usando ON COMMIT. Las opciones son:
PRESERVE ROWS
No se toma ninguna acción especial al final de la transacción. Esto es el comportamiento predeterminado.
DELETE ROWS
Todas las filas en la tabla temporal serán eliminadas al final de cada bloque de transacción. Esencialmente, un  TRUNCATE automático es hecho en cada confirmación.
DROP
La tabla temporal será eliminada al final del bloque de transacción.
TABLESPACE espacio_tabla
The espacio_tabla es el nombre del espacio de tabla en el cual la nueva tabla será creada. Si no se especifica, la configuración  default_tablespace es consultada, o  temp_tablespaces si la tabla es temporal.
USING INDEX TABLESPACE espacio_tabla
Esta clausula permite seleccionar el espacio de tablas en el cual serán creados los índices asociados a restricciones UNIQUE o PRIMARY KEY. Si no se especifica, la configuración  default_tablespace es consultada, o  temp_tablespaces si la tabla es temporal.

Parámetros de Almacenamiento

La clausula WITH puede especificar parámetros de almacenamiento para las tablas, y para los índices asociados con las restricciones UNIQUE o PRIMARY KEY. Los parámetros de almacenamiento para los índices están documentados en  CREATE INDEX. Los parámetros de almacenamiento actualmente disponibles para tablas están listados abajo. Para cada parámetro, hay un parámetro idéntico del mismo nombre con prefijo toast. que puede ser usado para controlar el comportamiento de la tabla de almacenamiento suplementaria, si existe; ver  Sección 53.2. Note que la tabla de almacenamiento suplementario hereda los valores para autovacuum de sus tablas padres, si no se establecen los ajustes toast.autovacuum_*.

fillfactor, toast.fillfactor (integer)
El factor de relleno (fillfactor) para una tabla es un porcentaje entre 10 y 100. 100 (empaquetado completo) es el predeterminado. Cuando se especifica un factor de relleno menor, las operaciones INSERT empaquetarán las páginas de la tabla solo hasta el porcentaje indicado; el espacio remanente en cada página se reserva para actualizaciones de filas en dicha página. Esto le da a UPDATE una oportunidad de poner la copia actualizada de la fila en la misma página que la original, lo que es más eficiente que emplazarla en una página diferente. Para una tabla cuyas entradas nunca son actualizadas, el empaquetado completo es la mejor opción, pero en tablas actualizadas fuertemente, son apropiados factores de relleno menores.
autovacuum_enabled, toast.autovacuum_enabled (boolean)
Habilita o deshabilita el demonio de vacío automático (autovacuum daemon) de en una tabla particular. Si se habilita, el demonio de vacío automático iniciará una operación VACUUM en una tabla particular cuando el número de actualizaciones o eliminaciones exceden el autovacuum_vacuum_threshold más autovacuum_vacuum_scale_factor veces el número de tuplas vivas actualmente estimadas de estar en la relación. Similarmente, iniciará una operación ANALYZE cuando el número de tuplas insertadas, actualizadas o eliminadas exceden autovacuum_analyze_threshold más autovacuum_analyze_scale_factor veces el número de túplas vivas actualmente estimado de estar en la relación. Si se deshabilita, esta tabla no será vaciada automáticamente, excepto para prevenir un reciclo del transaction Id (wraparound). Ver  Sección 23.1.4 para más información sobre la prevención del reciclo (wraparound). Observar que esta variable hereda su valor del ajuste  autovacuum.
autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)
Número mínimo de tuplas actualizadas o eliminadas antes de iniciar una operación de VACUUM en una tabla particular.
autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (float4)
Multiplicador de reltuples para agregar a autovacuum_vacuum_threshold.
autovacuum_analyze_threshold, toast.autovacuum_analyze_threshold (integer)
Número mínimo de tuplas insertadas, actualizadas o eliminadas antes de iniciar una operación ANALYZE en una tabla particular.
autovacuum_analyze_scale_factor, toast.autovacuum_analyze_scale_factor (float4)
Multiplicador de reltuples para agregar a autovacuum_analyze_threshold.
autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (integer)
Parámetro  autovacuum_vacuum_cost_delay personalizado.
autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer)
Parámetro  autovacuum_vacuum_cost_limit personalizado.
autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer)
Parámetro  vacuum_freeze_min_age personalizado. Note que el vacío automático ignorará los intentos de establecer un autovacuum_freeze_min_age por tabla mayor que la mitad del ajuste  autovacuum_freeze_max_age de todo el sistema.
autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)
Parámetro  autovacuum_freeze_max_age personalizado. Note que el vacío automático ignorará los intentos para establecer un autovacuum_freeze_max_age por tabla mayor que el ajuste de todo el sistema (solo puede ser menor). Note que mientras puede establecer autovacuum_freeze_max_age a un valor muy pequeño, o incluso cero, esto es usualmente imprudente dado que forzará un vaciamiento frequente.
autovacuum_freeze_table_age (integer)
Parámetro  vacuum_freeze_table_age personalizado.

Notas

Usar OIDs en aplicaciones nuevas no es recomendado: cuando sea posible, es preferible usar un SERIAL u otro generador de secuencias como la clave primaria de una tabla. Sin embargo, si su aplicación no hace uso de los OIDs para identificar las filas específicas de una tabla, es recomendado crear una restricción única en la columna oid de dicha tabla, para asegurase que los OIDs serán de hecho los únicos identificadores de filas áun luego de que el contador se recicle (wraparound). Evitar asumir que los OIDs son únicos entre tablas; si se necesita un identificador único para toda la base de datos, usar la combinación de tableoid y el OID de la fila para ese propósito.

Recomendación: El uso de OIDS=FALSE no se recomienda para tablas que no tienen claves primarias, dado que ya sea sin un OID o una dato único como llave, es dificultoso identificar filas específicas.

PostgreSQL crea automáticamente un índice para cada restricción única o clave primaria para reforzar su unicidad. Por lo tanto, no es necesario crear un ínidice explicitamente para las columnas de la clave primaria. (Ver  CREATE INDEX para más información.)

Las restricciones únicas y de clave primaria no son heredadas en la implementación actual. Esto hace que la combinación de herencia y restricciones únicas sea bastante disfuncional.

Una tabla no puede tener más de 1600 columnas. (En la práctica, el límite efectivo usualmente es menor dadas las restricciones de longitud de tupla)

Ejemplos

Crear la tabla peliculas y la tabla distribuidores:

CREATE TABLE peliculas (
    codigo      char(5) CONSTRAINT firstkey PRIMARY KEY,
    título      varchar(40) NOT NULL,
    did         integer NOT NULL,
    fecga_prod  date,
    genero      varchar(10),
    duracion    interval hour to minute
);
CREATE TABLE distribuidores (
     did    integer PRIMARY KEY DEFAULT nextval('serial'),
     nombre varchar(40) NOT NULL CHECK (nombre <> '')
);

Crear una tabla con un arreglo de 2 dimensiones:

CREATE TABLE arreglo_int (
    vector  int[][]
);

Definir una restricción única de tabla para la tabla peliculas. Las restricciones únicas de tabla pueden ser definidas en una o más columnas de la tabla:

CREATE TABLE peliculas (
    codigo      char(5),
    titulo      varchar(40),
    did         integer,
    fecha_prod  date,
    genero      varchar(10),
    duracion    interval hour to minute,
    CONSTRAINT produccion UNIQUE(fecha_prod)
);

Definir una restricción de chequeo de columna:

CREATE TABLE distribuidores (
    did     integer CHECK (did > 100),
    nombre  varchar(40)
);

Definir una restricción de chequeo de tabla:

CREATE TABLE distribuidores (
    did     integer,
    nombre  varchar(40)
    CONSTRAINT con1 CHECK (did > 100 AND nombre <> '')
);

Definir una restricción de clave primaria para la tabla peliculas:

CREATE TABLE peliculas (
    codigo      char(5),
    titulo      varchar(40),
    did         integer,
    fecha_prod  date,
    genero      varchar(10),
    duracion    interval hour to minute,
    CONSTRAINT codigo_titulo PRIMARY KEY(codigo,titulo)
);

Definir una restricción de clave primaria para la tabla distribuidores. Los dos ejemplos siguientes son equivalentes, el primero usa una sintaxis de restricción de tabla, el segundo de columna:

CREATE TABLE distribuidores (
    did     integer,
    nombre  varchar(40),
    PRIMARY KEY(did)
);
CREATE TABLE distribuidores (
    did     integer PRIMARY KEY,
    nombre  varchar(40)
);

Asignar una constante literal como valor predeterminado ('Luso Films') para la columna nombre, organizarse para que el valor predeterminado de did sea generado seleccionando el siguiente valor de un objeto secuencia, y hacer que el valor predeterminado de fechamod sea la fecha en que la fila sea insertada:

CREATE TABLE distribuidores (
    nombre    varchar(40) DEFAULT 'Luso Films',
    did       integer DEFAULT nextval('distribuidores _serial'),
    fechamod  timestamp DEFAULT current_timestamp
);

Definir dos restricciones de columnas NOT NULL en la tabla distribuidores, a una de las cuales se le asigna un nombre (no_nulo):

CREATE TABLE distribuidores (
    did     integer CONSTRAINT no_nulo NOT NULL,
    nombre  varchar(40) NOT NULL
);

Definir una restricción única para la columna nombre:

CREATE TABLE distribuidores (
    did     integer,
    nombre  varchar(40) UNIQUE
);

Lo mismo, pero especificado como una restricción de tabla:

CREATE TABLE distribuidores(
    did     integer,
    nombre  varchar(40),
    UNIQUE(nombre)
);

Crear la misma tabla, especificando un factor de relleno de 70% tanto para la tabla como sus índices únicos:

CREATE TABLE distribuidores(
    did     integer,
    nombre  varchar(40),
    UNIQUE(nombre) WITH (fillfactor=70)
)
WITH (fillfactor=70);

Crear la tabla cines en el espacio de tablas diskvol1:

CREATE TABLE cines (
        id serial,
        nombre text,
        ubicacion text
) TABLESPACE diskvol1;

Compatibilidad

El comando CREATE TABLE se ajusta al estándar SQL, con las excepciones listadas abajo.

Tablas Temporales

Aunque la sintaxis de CREATE TEMPORARY TABLE se parece a la del estándar SQL, el efecto no es el mismo. En el estándar, las tablas temporales son definidas solo una vez y automáticamente existen (empezando con contenido vacío) en cada sesión que las necesita. En cambio, PostgreSQL requiere que cada sesión emita su propio comando CREATE TEMPORARY TABLE para cada tabla temporal que sea usada. Esto permite que sesiones diferentes usen el mismo nombre de tabla temporal para distintos propósitos, considerando que el enfoque estándar restringe que dado un nombre de tabla temporal todas las instancias debe tener la misma estructura.

La definición estándar del comportamiento de una tabla temporal es ampliamente ignorado. El comportamiento de PostgreSQL en este punto es similar al de varias otras bases de datos SQL.

La distinción estándar entre las tablas temporales globales y locales no existe en PostgreSQL, dado que esa distinción depende del concepto de módulo, el cual PostgreSQL no posee. Para cuestiones de compatibilidad, PostgreSQL aceptará las palabras claves GLOBAL y LOCAL en una declaración de tabla temporal, pero no tendrán efecto.

La clausula ON COMMIT para las tablas temporales también se parece al estándar SQL, pero con algunas diferencias. Si se omite la cláusula ON COMMIT, SQL especifica que el comportamiento predeterminado es ON COMMIT DELETE ROWS. Sin embargo, el comportamiento predeterminado en PostgreSQL es ON COMMIT PRESERVE ROWS. La opción ON COMMIT DROP no existe en SQL.

Restricciones de chequeo de columnas

El estándar SQL dice que las restricciones CHECK de columnas solo se pueden referir a las columnas a las cuales aplican; solo las restricciones de tabla CHECK pueden referirse a múltiples columnas. PostgreSQL no hace cumplir esta restricción; trata del mismo modo a las restricciones de columna y de tabla.

"Restricción" NULL

La "restricción" NULL (de hecho una no-restricción) es una extensión de PostgreSQL al estándar SQL que es incluida para compatibilidad con otros sistemas de bases de datos (y por simetría con la restricción NOT NULL). Dado que es lo predeterminado para cualquier columna, su presencia es simplemente ruido.

Herencia

Herencia múltiple vía la clausula INHERITS es una extensión del lenguaje de PostgreSQL. SQL:1999 y posteriores definen herencia simple usando una sintaxis y semántica diferente. La herencia estilo SQL:1999 no es soportada aún por PostgreSQL.

Tablas sin columnas

PostgreSQL permite que una tabla sín columnas sea creada (por ejemplo, CREATE TABLE foo();). Esto es una extensión al estándar SQL, el cual no permite tablas de cero columnas. Tablas sin columnas no son en si mismas muy útiles, pero no permitirlas crea casos especiales extraños para ALTER TABLE DROP COLUMN, por lo que parece más limpio ignorar esta restricción de la especificación.

Clausula WITH

La clausula WITH es una extensión de PostgreSQL; ni los parámetros de almacenamiento ni los OIDs están en el estándar.

Espacios de tabla

El concepto de PostgreSQL de espacios de tabla no es parte del estándar. Por lo tanto, la clausula TABLESPACE y USING INDEX TABLESPACE son extensiones.

Ver también

 ALTER TABLE,  DROP TABLE,  CREATE TABLESPACE