CREATE TABLE

La commande CREATE TABLE permet de créer une nouvelle table, initialement vide, dans la base de données actuelle. La commande CREATE TABLE crée automatiquement un type de données qui représente le type de tuple (type de structure) correspondant à une ligne de la table.

Une table ne peut pas avoir :
  • Le même nom que n'importe quel type de données existant.
  • Le même nom qu'une table de catalogue système.
  • Plus de 1600 colonnes. La limite effective est légèrement inférieure en raison des contraintes liées à la longueur des tuiles.
  • Attributs de table ou de vue portant les noms suivants :
    • cmax
    • cmin
    • créerxid
    • ctid
    • datasliceid
    • deletexid
    • ID objet
    • ID ligne (rowid)
    • tableoid
    • xmax
    • xmin

Les clauses de contrainte facultatives spécifient les contraintes (ou tests) auxquelles les nouvelles lignes ou les lignes mises à jour doivent satisfaire pour qu'une opération d'insertion ou de mise à jour réussisse. Une contrainte est une règle nommée, c'est-à-dire un objet SQL qui permet de définir des ensembles de valeurs valides en limitant les résultats des opérations d'insertion, de mise à jour ou de suppression effectuées sur une table. Netezza Performance Server ne prend pas en charge les contrôles de contraintes ; si vous spécifiez des contraintes, vous devez procéder au contrôle des contraintes et à l'intégrité référentielle)

Vous pouvez définir des contraintes de table et des contraintes de colonne.
  • Une contrainte de colonne est définie dans le cadre de la définition d'une colonne.
  • La définition d'une contrainte de table n'est pas liée à une colonne particulière et peut englober plusieurs colonnes.

Vous pouvez également écrire chaque contrainte de colonne comme une contrainte de table. Une contrainte de colonne n'est qu'une commodité d'écriture si elle n'affecte qu'une seule colonne.

Spécification de distribution
Chaque table d'une base de données SGBDR Netezza Performance Server ne possède qu'une seule clé de distribution, qui consiste en une à quatre colonnes. Vous pouvez utiliser la syntaxe SQL suivante pour créer des clés de distribution.
  • Pour créer une clé de distribution explicite, la syntaxe SQL de Netezza Performance Server est la suivante :
    CREATE TABLE <tablename> [ ( <col>[,<col>… ] ) ] AS 
    <select_clause> [ DISTRIBUTE ON [HASH] ( <col>[<col>,… ] ) ]

    La phrase " distribute on indique la clé de répartition, le mot " hash est facultatif.

  • Pour créer une clé de distribution round-robin, la syntaxe SQL de Netezza Performance Server est la suivante :
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int)
    DISTRIBUTE ON RANDOM;

    L'expression " distribute on random indique une distribution à la ronde.

  • Pour créer une table sans spécifier de clé de distribution, la syntaxe SQL de Netezza Performance Server est la suivante :
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int);

    Le système Netezza Performance Server choisit une clé de distribution. Il n'y a aucun moyen de savoir quelle est cette clé et elle peut varier en fonction de la version du logiciel Netezza Performance Server

Règle de contrainte action
Vous pouvez spécifier les actions suivantes lors de la mise à jour ou de la suppression d'une contrainte. Le système n'imposant pas le contrôle des contraintes, ces règles sont simplement acceptées plutôt qu'utilisées.
  • CASCADE met à jour la valeur de la colonne de référence avec la nouvelle valeur de la colonne référencée.
  • SET NULL définit la colonne de référence à la nouvelle valeur de la colonne référencée.
  • SET DEFAULT définit la colonne référencée
  • RESTRICT est la même chose que NO ACTION
  • NO ACTION produit une erreur si la clé étrangère n'est pas respectée.
Attributs de la contrainte
Les contraintes peuvent avoir les attributs suivants qui déterminent si le contrôle de la contrainte est immédiat ou différé. Le système n'imposant pas de vérification des contraintes, ces attributs sont simplement acceptés plutôt qu'utilisés.
  • dEFERRABLE [NOT] détermine si la contrainte est vérifiée à la fin de la transaction.
  • INITIALLY DEFERRED vérifie la contrainte uniquement à la fin de la transaction.
  • INITIALLY IMMEDIATE vérifie la contrainte après chaque déclaration.

Syntaxe

Syntaxe générale de la commande 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> ]
Où " <col_constraint> représente :
[ CONSTRAINT <constraint_name> ] 
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
Où " <table_constraint> représente :
[ 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 ]
Où " <ref> représente :
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} ]

Le système autorise et maintient les clés primaires, les clés par défaut, les clés étrangères, les clés uniques et les références. Le système ne prend pas en charge les contrôles de contraintes et l'intégrité référentielle. L'utilisateur doit assurer le contrôle des contraintes et l'intégrité référentielle.

Entrées

La commande CREATE TABLE prend en compte les données suivantes :
Tableau 1. CREATE TABLE inputs
Entrée Descriptif
TEMP[ORARY] La table à créer est une table temporaire.
IF NOT EXISTS Si une table portant le nom spécifié existe dans la base de données et le schéma actuels, la commande CREATE TABLE ne génère pas d'erreur parce qu'elle n'a pas pu créer la table. Cette option est généralement utilisée pour les applications scriptées qui exécutent des commandes SQL et qui souhaitent supprimer le message d'erreur "table introuvable" afin qu'il n'ait pas d'impact sur l'application scripté ou qu'il ne l'interrompe pas. Si vous incluez cette option, notez les comportements suivants :
  • À moins que d'autres erreurs n'empêchent la création de la table, la commande renvoie un message CREATE TABLE même si elle n'a pas créé de table. (Cette option permet à la commande d'ignorer l'échec lorsqu'une table portant le même nom existe déjà)
  • Le tableau existant et le tableau spécifié dans la commande ne sont pas comparés ; les tableaux peuvent avoir des formes différentes. Le tableau existant reste tel quel avec sa forme actuelle et son contenu de ligne inchangé. Votre application doit s'assurer que la table et les lignes cibles sont conformes aux attentes.
  • La syntaxe IF NOT EXISTS ne peut pas être utilisée avec la clause AS SELECT. Cette forme de commande CREATE TABLE génère une erreur. Si vous souhaitez effectuer un CREATE TABLE ... AS SELECT, pensez à appeler d'abord la commande DROP TABLE IF EXISTS pour vous assurer que la table cible n'existe pas dans la base de données et le schéma avant d'utiliser la commande CREATE TABLE ... AS SELECT.
<table> Le nom de la table à créer.
<col> Le nom d'une colonne à créer dans la nouvelle table.
<type> Le type de données de la colonne.
Distribuer le Chaque table de la base de données doit avoir une clé de répartition composée d'une à quatre colonnes. La valeur par défaut est RANDOM, ce qui permet au système de sélectionner une clé de distribution aléatoire.
HASH Ce paramètre peut être spécifié à des fins de clarification mais n'a aucun effet sur la commande.
Organiser le Les colonnes (de un à quatre) sur lesquelles le tableau doit être organisé. Ceci ne peut pas être spécifié pour les tables externes. Si des colonnes sont spécifiées, la table ne peut pas avoir de vues matérialisées et tous les types de données des colonnes spécifiées doivent être applicables à la zone. La réorganisation des données de la table prend effet lorsque GROOM TABLE est exécuté. Pour plus d'informations, voir "Using Clustered Base Tables" dans le IBM® Netezza® System Administrator's Guide.
SÉCURITÉ DES RANGS Créez la table avec une sécurité au niveau des lignes.
<nom_de_la_contrainte> Nom à donner à une contrainte de colonne ou de table. Si vous n'indiquez pas de nom, le système en génère un.
NON REPORTABLE | REPORTABLE Contrôle si la contrainte peut être reportée à la fin de la transaction. NOT DEFERRABLE est la valeur par défaut. Netezza Performance Server ne prend pas en charge le contrôle des contraintes et l'intégrité référentielle)
INITIALLY Spécifie soit DEFERRED (à la fin de la transaction), soit IMMEDIATE (à la fin de chaque relevé).
NON NUL | NUL Si la colonne est autorisée à contenir des valeurs nulles. NULL est la valeur par défaut.
UNIQUE (contrainte de colonne et de table) Si chaque valeur de la colonne doit être unique.
PRIMARY KEY (contrainte de colonne et de table) Indique si les colonnes spécifiées doivent constituer la clé primaire de la table.

Cette contrainte est essentiellement une combinaison des contraintes UNIQUE et NOT NULL, mais l'identification d'un ensemble de colonnes en tant que clé primaire fournit également des métadonnées sur la conception du schéma. Une clé primaire implique que d'autres tables peuvent s'appuyer sur cet ensemble de colonnes comme identifiant unique pour les lignes.

Vous ne pouvez spécifier qu'une seule contrainte de clé primaire pour une table, soit en tant que contrainte de colonne, soit en tant que contrainte de table.

L'ensemble des colonnes qui constituent la clé primaire doit être différent de tout autre ensemble de colonnes nommé par une contrainte unique définie pour la table.

DEFAULT (contrainte de colonne) Valeur par défaut à placer dans chaque ligne pour cette colonne.
REFERENCES (contrainte de colonne) Les colonnes spécifiées de la nouvelle table ne doivent contenir que des valeurs qui correspondent aux valeurs des colonnes spécifiées de la table spécifiée.
FOREIGN KEY et REFERENCES table (contrainte de table) Les colonnes spécifiées de la nouvelle table ne doivent contenir que des valeurs qui correspondent aux valeurs des colonnes spécifiées de la table spécifiée. Si vous ne spécifiez pas de colonne, la valeur doit correspondre à la clé primaire de la table. Les colonnes spécifiées de la table référencée doivent avoir une contrainte de clé unique ou primaire dans cette table.
MATCH COMPLET MATCH FULL empêche une colonne d'une clé étrangère multicolonne d'être nulle si d'autres parties de la clé étrangère ne sont pas nulles. Il s'agit de la valeur par défaut. MATCH PARTIAL n'est pas pris en charge.
À LA MISE À JOUR | À LA SUPPRESSION Action à entreprendre lorsque la table ou les colonnes spécifiées sont mises à jour ou supprimées :
NO ACTION
Affiche une erreur si la clé étrangère n'est pas respectée. Il s'agit de la valeur par défaut.
RESTRICT
Identique à l'absence d'action.
CASCADE
Supprime toutes les lignes qui font référence à la ligne supprimée.
SET NULL
Fixe les valeurs des colonnes de référence à leur valeur par défaut.
SET DEFAULT
Fixe les valeurs des colonnes de référence à leur valeur par défaut.
DATA_VERSION_RETENTION_TIME <nombre de jours> La table tbl créée possède la valeur DATA_VERSION_RETENTION_TIME spécifiée ou obtient la valeur actuelle de la propriété à partir du schéma si rien n'est spécifié. Si la valeur DATA_VERSION_RETENTION_TIME d'une table est égale à 0 (qu'elle ait été spécifiée explicitement ou héritée du schéma), aucune donnée historique de la table n'est disponible pour les requêtes temporelles. Toutefois, les lignes supprimées peuvent être conservées pour d'autres raisons. Par exemple, la sauvegarde incrémentielle. Si DATA_VERSION_RETENTION_TIME d'une table est différent de zéro, les lignes historiques remontant à ce nombre de jours sont disponibles pour les requêtes temporelles.

La clause DATA_VERSION_RETENTION_TIME ne peut pas être utilisée avec CREATE TEMPORARY TABLE. Toutes les tables temporaires sont non temporelles et ne prennent pas en charge les requêtes sur les voyages dans le temps.

La valeur maximale autorisée est de 92 jours, ce qui correspond au nombre maximal de jours d'un trimestre civil.

Sorties

La commande a les résultats suivants :

Tableau 2. CREATE TABLE outputs
Sortie Descriptif
CREATE TABLE Le système renvoie ce message si la commande se termine avec succès.
ERROR Le système renvoie ce message si la création de la table échoue. Le message d'erreur fournit un texte descriptif, par exemple :ERROR: Relation 'table' already existsou d'autres messages. Si vous spécifiez la syntaxe IF NOT EXISTS, le système ne génère pas d'erreur lorsqu'une table portant le même nom existe déjà dans la base de données et le schéma actuels.

Droits

Vous devez être l'utilisateur admin, le propriétaire de la base de données ou du schéma, ou votre compte doit disposer du privilège Créer une table.

Utilisation

Voici un exemple d'utilisation :

  • Pour créer une table :
       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
       );
  • Pour définir une contrainte de table de clé primaire pour les films de la table, vous pouvez définir des contraintes de table de clé primaire sur une ou plusieurs colonnes de la table :
    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)
       );
  • Pour définir une contrainte de clé primaire pour la table distributeurs :
    CREATE TABLE distributors (
        did     DECIMAL(3),
        name    CHAR VARYING(40),
        PRIMARY KEY(did)
    ); CREATE TABLE distributors (
        did     DECIMAL(3) PRIMARY KEY,
        name    VARCHAR(40)
    );

    Les deux exemples sont équivalents. Le premier exemple utilise la syntaxe des contraintes de table. Le deuxième exemple utilise la notation des contraintes de colonne.

  • Définir deux contraintes de colonne non nulle sur la table distributeurs, dont l'une est explicitement un nom :
    CREATE TABLE distributors (
           did     DECIMAL(3) CONSTRAINT no_null NOT NULL,
           name    VARCHAR(40) NOT NULL
       );