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 [, ...] ) ]
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.
El nombre de una nueva clase o tabla a crear.
El nombre de un campo.
El tipo del campo. Puede incluir especificadores de array. Consulte la PostgreSQL User's Guide para más información sobre tipos y arrays.
Un valor por defecto para el campo. Consulte la cláusula DEFAULT para más información.
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.
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.
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.
Aside: La herencia de funciones se realiza siguiendo las convenciones del Common Lisp Object System (CLOS).
Mensaje devuelto si la table se ha creado con éxito.
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.
Si el tipo de datos o el valor por defecto no corresponde al tipo de datos de la definición del campo.
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.
DEFAULT value
Los posibles valores para la expresión DEFAULT (valor por defecto) son:
un literal
una función de usuario
una función niladic
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:
Consulte las funciones CURRENT_USER
todavía no soportadas
todavía no soportadas
Consulte las funciones CURRENT_DATE
Consulte las funciones CURRENT_TIME
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.
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' );
[ CONSTRAINT name ] { [ NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...]
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.
El campo puede contener valores NULL. Ésta es la opción por defecto.
El campo no puede contener valores NULL. Esto equivale a la restricción de campo CHECK (column NOT NULL).
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.
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.
La definición de la restricció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)
[ 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..
[ CONSTRAINT name ] UNIQUE
Este error ocurre en tiempo de ejecución si se intenta insertar un valor duplicado en un campo.
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.
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) );
[ CONSTRAINT name ] CHECK ( condition [, ...] )
Un nombre arbitrario dado a la restricción.
Cualquier expresión condicional válida que se evalue a un resultado boolenano.
Este error ocurre en tiempo de ejecución si alguien intenta insertar un valor ilegal en un campo sujeto a una restricción CHECK.
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.
[ CONSTRAINT name ] PRIMARY KEY
Esto ocurre en tiempo de ejecución si alguien intenta insertar un valor duplicado en una columna sujeta a una restricción PRIMARY KEY.
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.
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.
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] ) [ CONSTRAINT name ] CHECK ( constraint )
Un nombre arbitrario dado a una restricción de integridad.
El nombre de los campos para los que definimos un índice único y, para la PRIMARY KEY, una restricción NOT NULL.
Una expresión booleana a ser evaluado como la restricción.
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.
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).
[ CONSTRAINT name ] UNIQUE ( column [, ...] )
Un nombre arbitrario dado a una restricción.
Un nombre de un campo en una tabla.
Este error ocurre en tiempo de ejecución si se intenta insertar un valor duplicado en un campo.
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.
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )
Un nombre arbitrario para la restricción.
Los nombres de uno o más campos en la tabla.
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).
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.
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) );
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;
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 ]
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
SQL92 especifica alguna posibildad adicional para NOT NULL:
[ CONSTRAINT name ] NOT NULL [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
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.
significa que la restricción debe ser comprobada después de la ejecución de cada sentencia SQL.
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.
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.
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.
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 ]
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 ]