CREAR TABLA

Utilice el comando CREATE TABLE para crear una tabla nueva inicialmente vacía en la base de datos actual. El comando CREATE TABLE crea automáticamente un tipo de datos que representa el tipo de tupla (tipo de estructura) correspondiente a una fila de la tabla

Una tabla no puede tener:
  • El mismo nombre que un tipo de datos existente.
  • El mismo nombre que una tabla de catálogo de sistema.
  • Más de 1.600 columnas. El límite real es algo más pequeño, debido a restricciones de la longitud de tupla.
  • Atributos de tabla o vista con los nombres siguientes:
    • cmax
    • cmin
    • createxid
    • ctid
    • datasliceid
    • deletexid
    • oid
    • rowid
    • tableoid
    • xmax
    • xmin

Las cláusulas de restricción opcionales especifican restricciones (o pruebas) que deben cumplir las filas nuevas o actualizadas para que una operación de inserción o actualización tenga éxito. Una restricción es una regla especificada; es decir, un objeto SQL que ayuda a definir conjuntos de valores válidos limitando los resultados de las operaciones de inserción, actualización o supresión que se utilizan en una tabla. Netezza Performance Server no admite comprobaciones de restricciones; si especifica restricciones, debe realizar la comprobación de restricciones y la integridad referencial)

Puede definir restricciones de tabla y restricciones de columna.
  • Una restricción de columna se define como parte de una definición de columna.
  • Una definición de restricción de tabla no está vinculada a una columna particular, y puede abarcar más de una columna.

También puede escribir cada restricción de columna como una restricción de tabla. Una restricción de columna es solo una conveniencia de notación si la restricción solo afecta a una columna.

Especificación de distribución
Cada tabla de una base de datos RDBMS Netezza Performance Server tiene sólo una clave de distribución, que consta de una a cuatro columnas. Puede utilizar la siguiente sintaxis SQL para crear claves de distribución.
  • Para crear una clave de distribución explícita, la sintaxis SQL Netezza Performance Server es:
    CREATE TABLE <tablename> [ ( <col>[,<col>… ] ) ] AS 
    <select_clause> [ DISTRIBUTE ON [HASH] ( <col>[<col>,… ] ) ]

    La frase distribute on especifica la clave de distribución, la palabra hash es opcional.

  • Para crear una clave de distribución round-robin, la sintaxis SQL Netezza Performance Server es:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int)
    DISTRIBUTE ON RANDOM;

    La frase " distribute on random " especifica la distribución round-robin.

  • Para crear una tabla sin especificar una clave de distribución, la sintaxis SQL Netezza Performance Server es:
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int);

    El sistema Netezza Performance Server elige una clave de distribución. No hay forma de asegurar cuál es esa clave y puede variar dependiendo de la versión del software Netezza Performance Server.

Acción de regla de restricción
Puede especificar las siguientes acciones sobre la actualización o supresión de una restricción. Dado que el sistema no impone una comprobación de restricción, estas reglas simplemente se aceptan en lugar de usarse.
  • CASCADE actualiza el valor de la columna a la que se hace referencia al nuevo valor de la columna referida.
  • SET NULL establece la columna a la que se hace referencia en un nuevo valor de la columna referida.
  • SET DEFAULT establece la columna referida
  • RESTRICT es igual que NO ACTION
  • NO ACTION da un error si se vulnera la clave foránea.
Atributos de restricciones
Las restricciones pueden tener los siguientes atributos que determinan si la comprobación de restricción es inmediata o aplazada. Dado que el sistema no impone una comprobación de restricción, estos atributos simplemente se aceptan en lugar de usarse.
  • [NOT] DEFERRABLE determina si se comprueba la restricción al final de la transacción.
  • INITIALLY DEFERRED comprueba la restricción únicamente al final de la transacción.
  • INITIALLY IMMEDIATE comprueba la restricción después de cada sentencia.

Sintaxis

Sintaxis general para el comando create table:
CREATE [ TEMPORARY | TEMP ] TABLE [IF NOT EXISTS] <table>
( <col> <type> [<col_constraint>][,<col> <type> [<col_constraint>]…]
[<table_constraint>[,<table_constraint>… ] )
[ DISTRIBUTE ON { RANDOM | [HASH] (<col>[,<col>…]) } ]
[ ORGANIZE ON { (<col>) | NONE } ]
[ ROW SECURITY ]
[ DATA_VERSION_RETENTION_TIME <number-of-days> ]
Donde <col_constraint> representa:
[ CONSTRAINT <constraint_name> ] 
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
Donde <table_constraint> representa:
[ CONSTRAINT <constraint_name> ] 
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
Donde <ref> representa:
REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]

El sistema permite y mantiene la clave primaria, predeterminada, la clave foránea, exclusiva y referencias. El sistema no da soporte a comprobaciones de restricción y a la integridad referencial. El usuario debe asegurar las comprobaciones de restricción y la integridad referencial.

Entradas

El comando CREATE TABLE toma las siguientes entradas:
Tabla 1. Entradas de CREATE TABLE
Entrada Descripción
TEMP[ORARY] La tabla que se quiere crear debe ser una tabla temporal.
IF NOT EXISTS Si una tabla con el nombre especificado existe en la base de datos y el esquema actuales, el comando CREATE TABLE no genera un error porque no ha podido crear la tabla. Normalmente esta opción se utiliza para aplicaciones de script que ejecutan comandos SQL y desea suprimir el mensaje de error "tabla no encontrada" para que no repercuta en la aplicación de script o la detenga. Si incluye esta opción, tenga en cuenta los comportamientos siguientes:
  • A menos que otros errores hayan impedido la creación de tabla, el comando devuelve un mensaje CREATE TABLE aunque no haya creado una tabla. (Esta opción hace que el comando ignore la anomalía cuando ya existe una tabla con el mismo nombre.)
  • La tabla existente y la tabla especificada en el comando no se comparan; las tablas pueden tener formas diferentes. La tabla existente permanece como está con la forma actual y el contenido de fila sin cambios. La aplicación debe asegurarse de que la tabla y las filas de destino son como se esperaba.
  • La sintaxis IF NOT EXISTS no se puede utilizar con la cláusula AS SELECT. Este formato de comando CREATE TABLE genera un error. Si desea realizar un CREATE TABLE ... AS SELECT, considere la posibilidad de llamar primero al comando DROP TABLE IF EXISTS para asegurarse de que la tabla de destino no existe en la base de datos ni en el esquema antes de utilizar el comando CREATE TABLE ... Comando AS SELECT.
<table> Nombre de la tabla que se quiere crear.
<col> Nombre de una columna que se debe crear en la nueva tabla.
<type> El tipo de datos de la columna.
DISTRIBUTE ON Cada tabla de la base de datos debe tener una clave de distribución que conste de entre una y cuatro columnas. El valor predeterminado es RANDOM, que hace que el sistema seleccione una clave de distribución al azar.
HASH Este parámetro se puede especificar con fines de clarificación, pero no tiene ningún efecto en el comando.
ORGANIZE ON Las columnas (de una a cuatro) en las que se tiene que organizar la tabla. No se puede especificar para tablas externas. Si se especifican columnas, la tabla no puede tener ninguna vista materializada, y todos los tipos de datos de columna especificados se deben poder asignar a una zona. La reorganización de datos de la tabla surte efecto cuando se ejecuta GROOM TABLE. Para obtener más información, consulte "Uso de tablas base agrupadas" en IBM® Netezza® System Administrator's Guide.
ROW SECURITY Cree la tabla con seguridad en el nivel de fila.
<constraint_name> Nombre que desea dar a una restricción de columna o a una restricción de tabla. Si no se especifica ningún nombre, el sistema genera uno.
NOT DEFERRABLE | DEFERRABLE Controla si la restricción se puede aplazar hasta el final de la transacción. NOT DEFERRABLE es el valor predeterminado. Netezza Performance Server no admite la comprobación de restricciones ni la integridad referencial)
INITIALLY Especifica DEFERRED (al final de la transacción) o IMMEDIATE (al final de cada sentencia).
NOT NULL | NULL Especifica si la columna tiene permitido contener valores nulos. El valor predeterminado es NULL.
UNIQUE (restricción de columna y de tabla) Define si cada valor de la columna debe ser exclusivo.
PRIMARY KEY (restricción de columna y de tabla) Define si si las columnas especificadas deben formar la clave principal de la tabla.

Esta restricción es fundamentalmente una combinación de las restricciones UNIQUE y NOT NULL, pero identificar un conjunto de columnas como clave primaria también proporciona metadatos sobre el diseño del esquema. Una clave primaria implica que otras tablas pueden confiar en este conjunto de columnas como identificador exclusivo para filas.

Solo se puede especificar una restricción de clave primaria para una tabla, ya sea una restricción de columna o bien una restricción de tabla.

El conjunto de columnas que conforma la clave primaria debe ser diferente de todos los demás conjuntos de columnas nombrados en cualquier restricción exclusiva que esté definida para esta tabla.

DEFAULT (restricción de columna) El valor predeterminado que se colocará en cada fila de esta columna.
REFERENCES (restricción de columna) Las columnas especificadas de la nueva tabla deben contener únicamente valores que coincidan con valores de las columna especificadas de la tabla especificada.
Tabla FOREIGN KEY y REFERENCES (restricción de tabla) Las columnas especificadas de la nueva tabla deben contener únicamente valores que coincidan con valores de las columna especificadas de la tabla especificada. Si no se especifica ninguna columna, el valor debe coincidir con la clave primaria de la tabla. Las columnas especificadas de la tabla referenciada deben tener una restricción exclusiva o de clave primaria en dicha tabla.
MATCH FULL MATCH FULL impide que una columna de clave foránea de varias columnas sea nula si otras partes de la clave foránea no son nulas. Este es el valor predeterminado. MATCH PARTIAL no se admite.
ON UPDATE | ON DELETE La acción que se realiza cuando la tabla o las columnas especificadas se actualicen o se supriman:
SIN ACCIÓN
Emite un error si se vulnera la clave foránea. Este es el valor predeterminado.
RESTRICT
Igual que NO ACTION.
CASCADE
Suprime cualquier fila que haga referencia a la fila suprimida.
SET NULL
Establece los valores de la columna de referencia a su valor predeterminado.
SET DEFAULT
Establece los valores de la columna de referencia a su valor predeterminado.
DATA_VERSION_RETENTION_TIME <number-of-days> La tabla tbl que se crea tiene la DATA_VERSION_RETENTION_TIME especificada u obtiene el valor actual de la propiedad del esquema si no se especifica nada. Si DATA_VERSION_RETENTION_TIME de una tabla es 0 (tanto si se ha especificado explícitamente como si se ha heredado del esquema), no hay datos históricos de la tabla disponibles para consultas temporales. No obstante, las filas eliminadas deben conservarse por otros motivos. Por ejemplo, la copia de seguridad incremental. Si DATA_VERSION_RETENTION_TIME para una tabla es distinto de cero, las filas históricas que se remontan a ese número de días están disponibles para las consultas temporales.

La cláusula DATA_VERSION_RETENTION_TIME no puede utilizarse con CREATE TEMPORARY TABLE. Todas las tablas temporales son no temporales y no admiten consultas de desplazamiento en el tiempo.

El valor máximo permitido es de 92 días, que es el número máximo de días de un trimestre natural.

Resultados

El comando tiene las siguientes salidas:

Tabla 2. Salidas de CREATE TABLE
Resultado Descripción
CREATE TABLE El sistema devuelve este mensaje si el comando se completa correctamente.
ERROR El sistema devuelve este mensaje si falla la creación de tabla. El mensaje de error proporciona un texto descriptivo, como por ejemplo:ERROR: Relation 'table' already existsu otros mensajes. Si especifica la sintaxis IF NOT EXISTS, el sistema no genera un error cuando ya existe una tabla en la base de datos y esquema actuales con el mismo nombre.

Privilegios

Es necesario ser el usuario administrativo o el propietario de la base de datos o el esquema, o la cuenta debe tener el privilegio Create Table.

Uso

A continuación se proporciona el uso de muestra:

  • Para crear una tabla:
       CREATE TABLE name (
           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
       );
  • Para definir una restricción de tabla de clave primaria para la tabla films, puede definir las restricciones de tabla de clave primaria en una o más columnas de la tabla:
    CREATE TABLE films (
           code        CHAR(5),
           title       VARCHAR(40),
           did         DECIMAL(3),
           date_prod   DATE,
           kind        VARCHAR(10),
           len         INTERVAL HOUR TO MINUTE,
           CONSTRAINT code_title PRIMARY KEY(code,title)
       );
  • Para definir una restricción de clave primaria para los distribuidores de tabla:
    CREATE TABLE distributors (
        did     DECIMAL(3),
        name    CHAR VARYING(40),
        PRIMARY KEY(did)
    ); CREATE TABLE distributors (
        did     DECIMAL(3) PRIMARY KEY,
        name    VARCHAR(40)
    );

    Los dos ejemplos son equivalentes. El primer ejemplo utiliza la sintaxis de restricción de tabla. El segundo ejemplo utiliza la notación de restricción de columna.

  • Para definir dos restricciones de columna no nula en la tabla distributors, una de las cuales se explícitamente un nombre:
    CREATE TABLE distributors (
           did     DECIMAL(3) CONSTRAINT no_null NOT NULL,
           name    VARCHAR(40) NOT NULL
       );