CREATE TABLE

Nombre

CREATE TABLE  --  Crea una nueva tabla

Synopsis

CREATE [ TEMPORARY | TEMP ] TABLE table (
    column type
    [ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ]
    [column_constraint_clause | PRIMARY KEY } [ ... ] ]
    [, ... ]
    [, PRIMARY KEY ( column [, ...] ) ]
    [, CHECK ( condition ) ]
    [, table_constraint_clause ]
    ) [ INHERITS ( inherited_table [, ...] ) ]
  

Entradas

TEMPORARY

Se crea la tabla sólo para esta sesión, y es eliminada automáticamente con el fin de la sesión. Las tablas permanentes existentes con el mismo nombre no son visibles mientras la table temporal existe.

table

El nombre de una nueva clase o tabla a crear.

column

El nombre de un campo.

type

El tipo del campo. Puede incluir especificadores de array. Consulte la PostgreSQL User's Guide para más información sobre tipos y arrays.

DEFAULT value

Un valor por defecto para el campo. Consulte la cláusula DEFAULT para más información.

column_constraint_clause

La cláusula opcional de restricciones (constraint) especifica una lista de restricciones de integridad o comprueba que las nuevas inserciones o actualizaciones deben satisfacer para que la inserción o la actualización tenga éxito. Cada restricción debe evaluarse a una expresión booleana. Aunque SQL92 requiere la column_constraint_clause para referirse a ese campo sólamente, Postgres permite que múltiples campos sean referenciados dentro de un único campo constraint. Consulte la cláusula constraint para más información.

table_constraint_clause

La cláusula opcional CONSTRAINT especifica una lista de restricciones de integridad que las nuevas inserciones o las actualizaciones deberán satisfacer para que una sentencia insert o update tenga éxito. Cada restricción debe ser evaluada a una expresión booleana. Se pueden referenciar múltiples campos con una única restricción. Sólo se puede definir una única cláusula PRIMARY KEY por tabla; PRIMARY KEY column (una restricción de tabla) and PRIMARY KEY (una restricción de campo) son mutuamente excluyentes. Consulte la cláusula de restricción de tabla para más información.

INHERITS inherited_table

La cláusula opcional INHERITS especifica una colección de nombres de tabla de las cuales esta tabla hereda todos los campos. Si algún campo heredado aparece más de una vez, Postgres informa de un error. Postgres permite automáticamente a la tabla creada heredar funciones de las tablas superiores a ella en la jerarquía de herencia.

NotaAside
 

La herencia de funciones se realiza siguiendo las convenciones del Common Lisp Object System (CLOS).

Salidas

CREATE

Mensaje devuelto si la table se ha creado con éxito.

ERROR

Mensaje devuelto si la creación de la tabla falla. Este mensaje viene normalmente acompañado por algún texto explicativo, como: ERROR: Relation 'table' already exists que ocurre en tiempo de ejecución, si la tabla especificada ya existe en la base de datos.

ERROR: DEFAULT: type mismatched

Si el tipo de datos o el valor por defecto no corresponde al tipo de datos de la definición del campo.

Description

CREATE TABLE introducirá una nueva clase o tabla en la base de datos actual. La tabla será poseída por el usuario que introduce la sentencia.

Cada type puede ser un tipo simple, un tipo complejo (set) o un tipo array. Cada atributo puede ser especificado para ser no nulo, y puede tener un valor por defecto, especificado por la Cláusula DEFAULT.

Nota

Al igual que en la versión 6.0 de Postgres, consistant array dimensions within an attribute are not enforced. Esto cambiará probablemente en las versiones futuras.

La cláusula opcional INHERITS especifica una colección de nombres de clases de los cuales esta clase hereda automáticamente todos los campos. Si cualquier nombre de campo heredado aparece más de una vez, Postgres informa de un error. Postgres permite automáticamente a la clase creada heredar funciones de clases superiores en la jerarquía de herencia. La herencia de funciones se hace siguiendo las convenciones del Common Lisp Object System (CLOS).

Cada nueva tabla o clase table es creada automáticamente como tipo. Por tanto, una o más instancias de la clase son automáticamente un tipo y pueden ser usadas en otras MODIFICAR TABLA sentencias CREATE TABLE.

The new table is created as a heap with no initial data. Una tabla no puede tener más de 1600 campos (realmente, esto viene limitado por el hecho que el máximo tamaño de una tupla debe ser menor que 8192 bytes), pero este límite puede ser configurado a un tamaño menor en algunos sitios. Una tabla no puede tener el mismo nombre que una tabla de catálogo del sistema.

Cláusula DEFAULT

DEFAULT value
   

Entradas

value

Los posibles valores para la expresión DEFAULT (valor por defecto) son:

  • un literal

  • una función de usuario

  • una función niladic

Salidas

Ninguna.

Descripción

La cláusula DEFAULT asigna una valor por defecto a un campo (a través de una definición de campo en la sentencia CREATE TABLE). El tipo de dato de un valor por defecto debe corresponder al tipo de dato de la definición del campo.

Una operación de inserción (INSERT) que incluya un campo sin un valor especificado por defecto asignará el valor NULL al campo si no se le proporciona un valor explícito. Si el valor por defecto es un literal significa que que es un valor constante. Si el valor por defecto es una niladic-function o una user-function significa que dicho valor es el de la función especificada en el momento de la inserción.

Hay dos tipos de funciones niladic:

niladic USER

CURRENT_USER / USER

Consulte las funciones CURRENT_USER

SESSION_USER

todavía no soportadas

SYSTEM_USER

todavía no soportadas

niladic datetime

CURRENT_DATE

Consulte las funciones CURRENT_DATE

CURRENT_TIME

Consulte las funciones CURRENT_TIME

CURRENT_TIMESTAMP

Consulte la función CURRENT_TIMESTAMP

En la versión actual (v6.5), Postgres evalúa todas las expresiones por defecto en el momento en que la tabla es definida. Por tanto, las funciones que son "non-cacheable" como CURRENT_TIMESTAMP pueden no producir el efecto deseado. Para el caso particular de tipos date/time , se puede trabajar sobre este comportamiento usando "DEFAULT TEXT 'now'" en lugar de "DEFAULT 'now'" o "DEFAULT CURRENT_TIMESTAMP". Esto fuerza Postgres a considerar la constante como un tipo string y así convertirla al valor timestamp en tiempo de ejecución.

Uso

Para asignar un valor constante como valor por defecto para los campos did and number, y una cadena al campo did:

CREATE TABLE video_sales (
    did      VARCHAR(40) DEFAULT 'luso films',
    number   INTEGER DEFAULT 0,
    total    CASH DEFAULT '$0.0'
);
    

Para asignar una secuencia existente como valor por defecto para el campo did, y un literal para el campo name:

CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT NEXTVAL('serial'),
    name     VARCHAR(40) DEFAULT 'luso films'
);
    

Column CONSTRAINT Clause

[ CONSTRAINT name ] { [
    NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...]
   

Entradas

name

Un nombre arbitrario dado a la restricción de integridad Si no se especifica name, se genera de los nombres de l tabla y campos, lo que asegura unicidad para name.

NULL

El campo puede contener valores NULL. Ésta es la opción por defecto.

NOT NULL

El campo no puede contener valores NULL. Esto equivale a la restricción de campo CHECK (column NOT NULL).

UNIQUE

El campo debe contener un valor único. En Postgres esto es forzado por medio de la creación implícita de un índice único sobre la tabla.

PRIMARY KEY

Este campo es una clave primaria, lo que implica que la unicidad es forzada por el sistema y que otras tablas pueden confiar en este campo como identificador único para los registros. Consulte PRIMARY KEY para más información.

constraint

La definición de la restricción.

Descripción

La cláusula opcional de restricción (CONSTRAINT) especifica restricciones o verifica qué deben cumplir las nuevas inserciones o las actualizaciones para que una operación de inserción o de actualización tenga éxito. Cada restricción debe evaluarse a una expresión booleana. Con una única restricción se pueden referenciar múltiples atributos. El uso de PRIMARY KEY como restricción de tabla es mutuamente incompatible con el uso de PRIMARY KEY como restricción de campo.

Una restricción es una regla con nombre: un objeto SQL que ayuda a definir conjuntos de valores válidos poniendo límites a los resultados de las operaciones INSERT, UPDATE or DELETE sobre una tabla.

Existen dos maneras de definir restricciones de integridad: restricciones de tabla, que veremos más adelante, y restricciones de campo, que pasamos a ver.

Una restricción de campo es una restricción de integridad definida como parte de la definición de campo, y lógicamente se convierte en una restricción de tabla nada más ser creada. Las restricciones de campo disponibles son:

PRIMARY KEY
REFERENCES
UNIQUE
CHECK
NOT NULL

Nota

Postgres todavía no soporta (en su versión 6.5) restricciones de integridad especificadas por REFERENCES. Se acepta la sintaxis pero se ignora la cláusula (disponible, en cambio, a partir de la versión 7.0)

Restricción NOT NULL

[ CONSTRAINT name ] NOT NULL 
   

La restricción NOT NULL especifica una regla que obliga que un campo contenga únicamente valores no nulos. Ésta es únicamente una restricción de campo, y no se permite como restricción de tabla..

Salidas

status

ERROR: ExecAppend: Fail to add null value in not null attribute "column".

Este error ocurre en tiempo de ejecución cuando se intenta insertar un valor nulo en un campo que contiene la restricción NOT NULL.

Descripción

Uso

Definir dos restricciones de campo NOT NULL en la tabla distributors, una de las cuales se nombra:

CREATE TABLE distributors (
    did      DECIMAL(3) CONSTRAINT no_null NOT NULL,
    name     VARCHAR(40) NOT NULL
);
     

Restricción UNIQUE

[ CONSTRAINT name ] UNIQUE
   

Entradas

CONSTRAINT name

Una etiqueta arbitraria dada a una restricción.

Salidas

status

ERROR: Cannot insert a duplicate key into a unique index.

Este error ocurre en tiempo de ejecución si se intenta insertar un valor duplicado en un campo.

Descripción

La restricción UNIQUE especifica una regla que obliga a un grupo de uno o más campos de una tabla a contener valores únicos.

Las definiciones de campo de las columnas especificadas no tienen porqué incluir una restricción NOT NULL constraint para ser incluídos en una restricción UNIQUE. Tener más de un valor nulo en un campo sin la restricción NOT NULL, no viola la restricción UNIQUE. (This deviates from the SQL92 definition, but is a more sensible convention. See the section on compatibility for more details.).

Cada restricción de campo UNIQUE debe nombrar un campo que es distitno del conjunto de campos nombrados por cualquier otra restricción UNIQUE o PRIMARY KEY definifas por la tabla.

Nota

Postgres crea automáticamente un índice único por cada restricción UNIQUE, para asegurar la integridad de los datos. Vea CREATE INDEX para más información.

Uso

Define una restricción de campo UNIQUE para la tabla distributors. Las restricciones de campo UNIQUE solo son definidas sobre un campo de la tabla:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40) UNIQUE
);
  
lo que equivale a la siguiente restricción de tabla:
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

La restricción CHECK

[ CONSTRAINT name ] CHECK
    ( condition [, ...] ) 
   

Entradas

name

Un nombre arbitrario dado a la restricción.

condition

Cualquier expresión condicional válida que se evalue a un resultado boolenano.

Outputs

status

ERROR: ExecAppend: rejected due to CHECK constraint "table_column".

Este error ocurre en tiempo de ejecución si alguien intenta insertar un valor ilegal en un campo sujeto a una restricción CHECK.

Descripción

La restricción CHECK especifica una restricción sobre los valores permitidos en un campo. La restricción CHECK también se permite como restricción de tabla.

Las resticciones de campo CHECK de SQL92 sólo pueden ser definidas sobre un campo de la tabla, y solamente pueden referirse a un campo. Postgres no tiene esta restricción.

Restricción PRIMARY KEY

[ CONSTRAINT name ] PRIMARY KEY 
   

Entradas

CONSTRAINT name

Un nombre arbitrario para la restricción.

Salidas

ERROR: No se puede insertar un valor duplicado en un índice único.

Esto ocurre en tiempo de ejecución si alguien intenta insertar un valor duplicado en una columna sujeta a una restricción PRIMARY KEY.

Descripción

La restricción de campo PRIMARY KEY especifica que un campo de una tabla solamente puede contener valores únicos (no duplicados) y no nulos . La definición de la columna especificada no tiene que incluir una restricción explícita NOT NULL para ser incluída en una restricción PRIMARY KEY.

Sólo se puede especificar una única clave primaria (PRIMARY KEY) por tabla.

Notas

Postgres crea automáticamente un índice único para asegurar la integridad de los datos. (Vea la sentencia CREATE INDEX)

La restricción de clave primaria (PRIMARY KEY) debe nombrar un conjunto de campos que no sean contenidos por ninguna otra restricción UNIQUE definidos por la misma tabla, ya que produciría una duplicación de índices equivalentes y una sobrecarga adicional en tiempo de ejecución. Sin embargo, Postgres no lo deshabilita específicamente.

Cláusula CONSTRAINT para tablas

[ CONSTRAINT name ] { PRIMARY KEY |  UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
   

Entradas

CONSTRAINT name

Un nombre arbitrario dado a una restricción de integridad.

column [, ...]

El nombre de los campos para los que definimos un índice único y, para la PRIMARY KEY, una restricción NOT NULL.

CHECK ( constraint )

Una expresión booleana a ser evaluado como la restricción.

Salidas

Las posibles salidas para la cláusula de restricción de tablas son las mismas que para las partes correspondientes de la cláusula restricción de campo.

Descripción

Una restricción de tabla es una restricción de integridad definidad sobre uno o más campos de una tabla base. Las cuatro variaciones de restricciones de tabla son:

UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

Nota

Postgres todavía no soporta (en su versión 6.5) las restricciones de integridad FOREIGN KEY. El compilador entiende la sintaxis de FOREIGN KEY, pero solo imprime un aviso e ignora la cláusula. Las claves ajenas pueden ser parcialmente emuladas por medio de triggers (Consulte la sentencia CREATE TRIGGER).

Restricción UNIQUE

[ CONSTRAINT name ] UNIQUE ( column [, ...] )
    

Entradas

CONSTRAINT name

Un nombre arbitrario dado a una restricción.

column

Un nombre de un campo en una tabla.

Salidas

status

ERROR: Cannot insert a duplicate key into a unique index.

Este error ocurre en tiempo de ejecución si se intenta insertar un valor duplicado en un campo.

Descripción

La restricción UNIQUE especifica una regla en la que un grupo de uno The UNIQUE constraint specifies a rule that a group of one or o más campos diversos de una tabla puede contener solo valores únicos. El comportamiento de la restricción de tabla UNIQUE es el mismo que para la restricción de campo, con la posibilidad adicional de aplicarlo a más de un campo.

Consulte la sección sobre la restricción de campo UNIQUE para más detalles.

Uso

Define una restricción de tabla UNIQUE en la tabla distributors:

CREATE TABLE distributors (
    did      DECIMAL(03),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

Restricción PRIMARY KEY

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) 
    

Entradas

CONSTRAINT name

Un nombre arbitrario para la restricción.

column [, ...]

Los nombres de uno o más campos en la tabla.

Salidas

status

ERROR: Cannot insert a duplicate key into a unique index.

Esto ocurre en tiempo de ejecución si alguien intenta insertar un valor duplicado en un campo sujeto a una restricción de clave primaria (PRIMARY KEY).

Descripción

La restricción PRIMARY KEY especifica una regla en la que un grupo de uno o más campos de una tabla puede contener sólo valores únicos (no duplicados) y no nulos. Las definiciones de campo de los campos especificados no necesita incluir una restricción NOT NULL para ser incluída en una restricción PRIMARY KEY.

La restricción de tabla PRIMARY KEY es similar a la respectiva restricción de campo, con la posibilidad de extenderla with the additional capability of encompassing multiple columns.

Consulte la sección sobre la restricción de campo PRIMARY KEY para más infomación.

Uso

Crea las tablas films y distributors:

CREATE TABLE films (
     code      CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
     title     CHARACTER VARYING(40) NOT NULL,
     did       DECIMAL(3) NOT NULL,
     date_prod DATE,
     kind      CHAR(10),
     len       INTERVAL HOUR TO MINUTE
);
   
CREATE TABLE distributors (
     did      DECIMAL(03) PRIMARY KEY DEFAULT NEXTVAL('serial'),
     name     VARCHAR(40) NOT NULL CHECK (name <> '')
);
   

Crea una tabla con un array de 2 dimensiones:

   CREATE TABLE array (
          vector INT[][]
          );
   

Define una restricción de tabla UNIQUE para la tabla films. Las restricciones de tabla UNIQUE pueden ser definidas sobre uno o más campos de la tabla:

	CREATE TABLE films (
    code      CHAR(5),
    title     VARCHAR(40),
    did       DECIMAL(03),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT production UNIQUE(date_prod)
);
   

Define una restricción de campo CHECK:

CREATE TABLE distributors (
    did      DECIMAL(3) CHECK (did > 100),
    name     VARCHAR(40)
);
   

Define una restricción de tabla CHECK:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40)
    CONSTRAINT con1 CHECK (did > 100 AND name > '')
);
   

Define una restricción de tabla PRIMARY KEY para la tabla films. Las restricciones de tabla PRIMARY KEY pueden ser definidas sobre uno o más campos de la tabla:

CREATE TABLE films (
    code      CHAR(05),
    title     VARCHAR(40),
    did       DECIMAL(03),
    date_prod DATE,
    kind      CHAR(10),
    len       INTERVAL HOUR TO MINUTE,
    CONSTRAINT code_title PRIMARY KEY(code,title)
);
   

Define una restricción de campo PRIMARY KEY para la tabla distributors. Las restricciones de campo PRIMARY KEY solamente se pueden definir para un campo de la tabla (los siguientes dos ejemplos serían equivalentes) :

	CREATE TABLE distributors (
    did      DECIMAL(03),
    name     CHAR VARYING(40),
    PRIMARY KEY(did)
); 
   
CREATE TABLE distributors (
    did      DECIMAL(03) PRIMARY KEY,
    name     VARCHAR(40)
);
   

Notas

CREATE TABLE/INHERITS es una extensión al lenguaje de Postgres.

Compatibilidad

SQL92

Además de la tabla temporal visible localmente, SQL92 define una sentencia CREATE GLOBAL TEMPORARY TABLE , y opcionalmente una cláusula ON COMMIT:

CREATE GLOBAL TEMPORARY TABLE table ( column type [
    DEFAULT value ] [ CONSTRAINT column_constraint ] [, ...] )
    [ CONSTRAINT table_constraint ] [ ON COMMIT { DELETE | PRESERVE } ROWS ] 
   

Para tablas temporales, la sentencia CREATE GLOBAL TEMPORARY TABLE nombra una nueva tabla visible a otros clientes y define los campos de la tabla y las restricciones.

La cláusula opcional ON COMMIT de CREATE TEMPORARY TABLE especifica si la tabla temporal debe vaciarse de registros cada vez que se ejecuta un COMMIT o no. Si se omite la cláusula ON COMMIT, se asume la opción por defecto, ON COMMIT DELETE ROWS.

Para crear una tabla temporal:

CREATE TEMPORARY TABLE actors (
    id         DECIMAL(03),
    name       VARCHAR(40),
    CONSTRAINT actor_id CHECK (id < 150)
) ON COMMIT DELETE ROWS;
    

Cláusula UNIQUE

SQL92 especifica algunas posibilidades adicionales para UNIQUE:

Definición de restricción de tabla:

[ CONSTRAINT name ] UNIQUE ( column [, ...] )
    [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
    [ [ NOT ] DEFERRABLE ]
     

Definición de restricción de campo:

[ CONSTRAINT name ] UNIQUE
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

cláusula NULL

La restricción NULL (realmente no es una restricción) es una extensión Postgres a SQL92 incluída por simetría con la cláusula NOT NULL. Como es el valor por defecto para cualquier campo, su presencia es redundante.

[ CONSTRAINT name ] NULL 
     

cláusula NOT NULL

SQL92 especifica alguna posibildad adicional para NOT NULL:

[ CONSTRAINT name ] NOT NULL 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

cláusula CONSTRAINT

SQL92 especifica alguna posibilidad adicional para restricciones, y también define restricciones de assertions y de dominio.

Nota

Postgres todavía no soporta ni dominios ni assertions.

Una assertion es un tipo especial de restricción de integridad y comparte el mismo espacio de nombres con otras restricciones. Sin embargo, una assertion no es necesariamente dependiente de una particular tabla base como son las restricciones, así que SQL-92 proporciona la sentencia CREATE ASSERTION como un método alternativo para definir una restricción:

CREATE ASSERTION name CHECK ( condition )
    

Las restricciones de dominio se definen con las sentencias CREATE DOMAIN o ALTER DOMAIN:

Restricción de dominio:

[ CONSTRAINT name ] CHECK constraint 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

Definición de restricciones de tabla:

[ CONSTRAINT name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint }
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

Definición de restricciones de campo:

[ CONSTRAINT name ] { NOT NULL | PRIMARY KEY | FOREIGN KEY constraint | UNIQUE | CHECK constraint }  
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

Una definición de restricción de integridad (CONSTRAINT) puede contener un atributo o cláusula DEFERRABLE y /o una cláusula del modo inicial de restricción, en cualquier orden.

NOT DEFERRABLE

significa que la restricción debe ser comprobada después de la ejecución de cada sentencia SQL.

DEFERRABLE

significa que la verificación del cumplimiento de la restricción puede ser aplazado hasta más tarde, pero no más tarde que el final de la actual transacción.

El modo de restricción para cada restricción tiene siempre un valor incial por defecto que se establece para la restricción al principio de la transacción.

INITIALLY IMMEDIATE

significa que, desde el principio de la transacción, la restricción debe ser comprobada después de la ejecución de cada sentencia SQL.

INITIALLY DEFERRED

significa que, como se está al principio de la transacción, la comprobación de la restricción puede ser aplazada hasta más tarde, pero no más tarde que en el final de la actual transacción. O sea, que la restricción puede ser incumplida por alguna sentencia SQL en un punto intermedio de la transacción, pero no al final de la misma.

Cláusula CHECK

SQL92 especifica alguna capacidad adicional para CHECK tanto en la restricciones de tabla como en la de campo.

definición de restricción de tabla:

[ CONSTRAINT name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

definición de restricción de campo:

[ CONSTRAINT name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
    

cláusula PRIMARY KEY

SQL92 especifica algunas posibilidades adicionales para la PRIMARY KEY:

Definición de restricciones de tabla:

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

Definición de restricciones de campo:

[ CONSTRAINT name ] PRIMARY KEY 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]