CREATE TABLE (instruction)
L'instruction CREATE TABLE définit une table. La définition doit inclure son nom et les noms et attributs de ses colonnes. La définition peut inclure d'autres attributs de la table, tels que sa clé primaire ou les contraintes de vérification.
Pour créer une table temporaire créée, utilisez l'instruction CREATE GLOBAL TEMPORARY TABLE. Pour déclarer une table temporaire déclarée, utilisez l'instruction DECLARE GLOBAL TEMPORARY TABLE.
Invocation
Cette instruction peut être imbriquée dans un programme d'application ou émise à l'aide d'instructions SQL dynamiques. Il s'agit d'une instruction exécutable qui peut être préparée dynamiquement uniquement si le comportement d'exécution DYNAMICRULES est en vigueur pour le package (SQLSTATE 42509).
Autorisation
L'ID d'autorisation de la déclaration doit avoir l'autorité DBADM ou satisfaire à trois exigences principales afin de créer une table.
- DBADM
- CREATETAB autorité sur la base de données
- SCHEMAADM autorité sur le schéma, si le nom du schéma de la table fait référence à un schéma existant
- Droits IMPLICIT_SCHEMA sur la base de données, si le nom de schéma implicite ou explicite de la table n'existe pas.
- Privilège CREATEIN sur le schéma, si le nom de schéma de la table fait référence à un schéma existant.
- Droits SCHEMAADM sur le schéma, si le nom de schéma de la table fait référence à un schéma existant.
- DBADM
- Privilège USE sur l'espace table
- DBADM
- Droits d'accès SYSADM
- Droits d'accès SYSCTRL
- L'ID autorisation doit être identique au propriétaire de la table racine de la hiérarchie de tables.
- Les privilèges détenus par l'ID autorisation doivent inclure les droits SCHEMAADM sur le schéma qui contient la table racine de la hiérarchie de tables.
- Les privilèges détenus par l'ID autorisation doivent inclure les droits DBADM.
- Privilège REFERENCES sur la table
- Privilège REFERENCES sur chaque colonne de la clé parente spécifiée
- Droit CONTROL sur la table
- Droits SCHEMAADM sur le schéma, si le nom de schéma de la table parent fait référence à un schéma existant.
- Droits d'accès DBADM
- L'ID autorisation de l'instruction doit avoir au moins un des privilèges suivants sur chaque table ou vue identifiée dans l'instruction fullselect (les privilèges détenus par les groupes ne sont pas pris en compte) :
- Privilège SELECT sur la table ou la vue
- Privilège CONTROL sur la table ou la vue
- Privilège SELECTIN sur le schéma qui contient la table ou la vue
- Droits DATAACCESS sur le schéma qui contient la table ou la vue
- Droits d'accès DATAACCESS
- L'ID autorisation de l'instruction doit avoir au moins l'un des privilèges suivants sur chaque table identifiée dans l'instruction fullselect (cela est nécessaire pour modifier la table de base pour l'associer à la table de requêtes matérialisée) :
- Privilège ALTER sur la table ou la vue
- Privilège CONTROL sur la table ou la vue
- Droits SCHEMAADM sur le schéma qui contient la table ou la vue
- Droits d'accès DBADM
- Au moins un des privilèges suivants pour la table de requêtes matérialisée :
- Privilège ALTER sur la table de requêtes matérialisée
- Privilège CONTROL sur la table de requêtes matérialisée
- Droits SCHEMAADM sur le schéma qui contient la table de requêtes matérialisée
- Droits d'accès DBADM
- Au moins un des privilèges suivants pour chaque table ou vue identifiée dans l'instruction fullselect de la table de requêtes matérialisée :
- Privilège SELECT sur la table ou la vue
- Privilège CONTROL sur la table ou la vue
- Privilège SELECTIN sur le schéma qui contient la table ou la vue
- Droits DATAACCESS sur le schéma qui contient la table ou la vue
- Droits DATAACCESS sur la base de données
- Privilège ALTER sur la table ou la vue
- Privilège CONTROL sur la table ou la vue
- Droits SCHEMAADM sur le schéma qui contient la table ou la vue
- Droits d'accès DBADM
Syntaxe
- 1 If you specify a dimensions clause, key sequence, or insert time, specifying ROW USING is optional unless the default table organization for the database is COLUMN, in which case specifying ROW USING is mandatory.
- 2 If the first column-option chosen is a generated-clause with a generation-expression, then the data-type can be omitted. It will be determined from the resulting data-type of the generation-expression.
- 3 The specified distinct type cannot have any data type constraints and the source type cannot be an anchored data type.
- 4 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
- 5 DB2SECURITYLABEL is the built-in distinct type that must be used to define the row security label column of a protected table.
- 6 A column of type DB2SECURITYLABEL, NOT NULL WITH DEFAULT is implicit and cannot be explicitly specified (SQLSTATE 42842). The default value for a column of type DB2SECURITYLABEL is the session authorization ID's security label for write access.
- 7 The lob-options clause only applies to large object types (BLOB, CLOB, and DBCLOB) and distinct types based on large object types.
- 8 The SCOPE clause only applies to the REF type.
- 9 The default-clause and generated-clause cannot both be specified for the same column definition (SQLSTATE 42614).
- 10 INLINE LENGTH applies only to columns defined as structured, XML, or LOB types.
- 11 The same clause must not be specified more than once.
- 12 Data type is optional for a row change timestamp column if the first column-option specified is a generated-clause. The data type default is TIMESTAMP(6).
- 13 Data type is optional for row-begin and row-end timestamp columns if the first column-option specified is a generated-clause. The data type default is TIMESTAMP(12).
- 14 Data type is optional for a transaction-start-ID timestamp columns if the first column-option specified is a generated-clause. The data type default is TIMESTAMP(12).
- 15 Specifying which table space contains a table's indexes can be done when the table is created. If the table is a partitioned table, the index table space for a nonpartitioned index can be specified with the IN clause of the CREATE INDEX statement.
- 16 This syntax for a partition-element is valid if only one partition-expression exists with a numeric or datetime data type.
- 17 The first partition-element must include a starting-clause and the last partition-element must include an ending-clause.
Description
Les tables de requêtes matérialisées system-maintained, user-maintained, federated_tool-maintained, and replication-maintained (tables fantômes) sont désignées par le terme commun table de requêtes matérialisée, à moins qu'il soit nécessaire d'identifier chacune d'elles séparément.
- IF NOT EXISTS
- Indique qu'aucun message d'erreur n'est affiché lorsque la table ne peut pas être créée, car une table portant le nom spécifié existe déjà dans la base de données et le schéma en cours. Généralement, vous utilisez cette option pour les applications scriptées qui exécutent des commandes SQL. Lorsque vous supprimez leTable not foundmessage d'erreur, l'application scriptée n'est pas impactée ou arrêtée. table-name
- Nomme la table. Le nom, y compris le qualificatif implicite ou explicite, ne doit pas identifier une table, une vue, un alias ou un alias décrit dans le catalogue. Le nom de schéma ne doit pas être SYSIBM, SYSCAT, SYSFUN ou SYSSTAT (SQLSTATE 42939). element-list
- Définit les éléments d'une table, y compris la définition des colonnes et des contraintes sur la table. column-definition
- Définit les attributs d'une colonne.
- nom-colonne
- Nomme une colonne de la table. Le nom ne peut pas être qualifié et le même nom ne peut pas être utilisé pour plus d'une colonne de la table (SQLSTATE 42711).
Une table organisée par lignes peut comporter les éléments suivants:
- Taille de page 4K avec un maximum de 500 colonnes, dont la taille de ligne ne doit pas être supérieure à 4005.
- Taille de page 8K avec un maximum de 1012 colonnes, dont la taille de ligne ne doit pas être supérieure à 8101.
- Taille de page 16K avec un maximum de 1012 colonnes, dont la taille de ligne ne doit pas être supérieure à 16 293.
- Une taille de page 32K avec un maximum de 2048 colonnes, où la taille de la ligne ne doit pas être supérieure à 32 677.
Un tableau organisé en colonnes peut comporter un maximum de 2048 colonnes, quelle que soit la taille de la page, et le nombre d'octets de toutes les colonnes, y compris les frais généraux, ne doit pas être supérieur à 1 048 319.
Pour plus d'informations, voir Limite de taille de ligne.
data-type - Spécifie le type de données de la colonne.
- built-in-type
- L'un des types de données intégrés suivants :
- SMALLINT
- Un petit nombre entier.
- [ENTIER | INT]
- Un grand nombre entier.
- BIGINT
- Un très grand nombre entier.
- [ DECIMAL | DEC | NUMERIC | NUM ] (entier-précision, entier-échelle)
- Un nombre décimal.
- L'entier de précision indique le nombre total de chiffres. Il doit être comprise entre 1 et 31. La valeur par défaut est 5.
- L'entier d'échelle indique le nombre de chiffres à droite du séparateur décimal. Il ne peut pas être négatif et ne peut pas dépasser la précision. La valeur par défaut est 0.
- FLOAT(integer)
- Un nombre à virgule flottante simple ou double précision. Si la longueur spécifiée est dans la plage :
- 1 - 24, le nombre utilise une seule précision.
- 25 - 53, le nombre utilise la double précision.
Au lieu de FLOAT, vous pouvez spécifier :- REAL
- Pour un point flottant de précision unique.
- DOUBLE
- Pour une virgule flottante double précision.
- DOUBLE PRECISION
- Pour une virgule flottante double précision.
- FLOAT
- Pour une virgule flottante double précision.
- DECFLOAT(precision-integer)
- Un nombre décimal en virgule flottante. L'entier de précision indique le nombre total de chiffres, qui peuvent être 16 ou 34. La valeur par défaut est 34.
- [CHARACTER | CHAR](integer [OCTETS | CODEUNITS32])
- Chaîne de caractères de longueur fixe du nombre spécifié d'unités de code. Ce nombre peut aller de 1 à 255 OCTETS ou de 1 à 63 CODEUNITS32. Par défaut, il s'agit de 1.
- [VARCHAR | CHARACTER VARYING | CHAR VARYING](integer [OCTETS | CODEUNITS32])
- Chaîne de caractères de longueur variable avec une longueur maximale du nombre spécifié d'unités de code. Ce nombre peut aller de 1-32672 OCTETS ou de 1 à 8168 CODEUNITS32.
- Pour données binaires
- Indique que le contenu de la colonne doit être traité comme des données binaires. Lors de l'échange de données avec d'autres systèmes, les conversions de pages de codes ne sont pas effectuées. Les comparaisons sont effectuées en binaire, indépendamment de la séquence de classement de la base de données.
- [CLOB | CHARACTER LARGE OBJECT | CHAR LARGE OBJECT](integer [K | M | G] [OCTETS | CODEUNITS32])
- Chaîne CLOB (character large object) avec une longueur maximale du nombre spécifié d'unités de code. La valeur par défaut est 1 048 576 unités de code (1M).Si vous souhaitez multiplier l'entier de longueur par 1024 (kilo), 1 048 576 (méga) ou 1 073 741 824 (giga), spécifiez un multiplicateur K (kilo), M (méga) ou G (giga).
- Quel que soit le multiplicateur, le cas échéant, la longueur obtenue est limitée par la longueur maximale d'une colonne CLOB, qui est de 2 147 483 646 (pour OCTETS) ou de 536 870 911 (pour CODEUNITS32). Si un multiple de K, M ou G dépasse légèrement cette longueur maximale (par exemple, 2G = 2 147 483 648), la longueur maximale est utilisée à la place.
- Tout nombre d'espaces (y compris les espaces nuls) est autorisé entre le type de données et la spécification de longueur ou entre l'entier de longueur et le multiplicateur K, Mou G . Par exemple, les spécifications suivantes sont toutes équivalentes et valides :
CLOB(50K) CLOB(50 K) CLOB (50 K) - Le multiplicateur K, Mou G peut être spécifié en majuscules ou en minuscules.
Dans une base de données Unicode, les unités de chaîne par défaut pour un type de données de chaîne de caractères sont déterminées par la valeur de la variable globale NLS_STRING_UNITS ou du paramètre de configuration de base de données string_units. Dans une base de données non-Unicode, les unités de chaîne par défaut pour les types de données de type chaîne de caractères sont OCTETS.
- OCTETS
- Indique que les unités de l'attribut length sont des octets.
- CODEUNITS32
- Indique que les unités de l'attribut length sont des unités de code Unicode UTF-32, ce qui correspond approximativement au nombre de caractères. Cela n'affecte pas la page de codes sous-jacente du type de données. La longueur réelle d'une valeur de données est déterminée en comptant les unités de code UTF-32 comme si les données ont été converties en UTF-32. CODEUNITS32 ne peut être spécifié que dans une base de données Unicode (SQLSTATE 560AA).
- GRAPHIC(integer [CODEUNITS16 | CODEUNITS32])
- Chaîne graphique de longueur fixe de la longueur spécifiée, qui peut aller de 1 à 127 doubles octets, 1 - 127 CODEUNITS16 ou 1 - 63 CODEUNITS32. La longueur par défaut est 1.
- VARGRAPHIC(integer [CODEUNITS16 | CODEUNITS32])
- Chaîne graphique de longueur variable de la longueur maximale spécifiée, qui peut aller de 1 à 16336 octets doubles, 1 - 16336 CODEUNITS16 ou 1 - 8168 CODEUNITS32.
- DBCLOB(integer [K | M | G] [CODEUNITS16 | CODEUNITS32])
- Une chaîne d'objets de grande taille de la longueur maximale spécifiée en octets doubles, unités de code Unicode UTF-16 ou unités de code Unicode UTF-32. La valeur par défaut est 1 048 576 unités de code (1M).Si vous souhaitez multiplier l'entier de longueur par 1024 (kilo), 1 048 576 (méga) ou 1 073 741 824 (giga), spécifiez un multiplicateur K (kilo), M (méga) ou G (giga).
- Quel que soit le multiplicateur, le cas échéant, la longueur résultant est limitée par la longueur maximale d'une colonne DBCLOB, qui est de 1 073 741 823 (pour deux octets ou CODEUNITS16) ou de 536 870 911 (pour CODEUNITS32). Si un multiple de K, M ou G dépasse légèrement cette longueur maximale (par exemple, 1G = 1 073 741 824), la longueur maximale est utilisée à la place.
- Tout nombre d'espaces (y compris les espaces nuls) est autorisé entre le type de données et la spécification de longueur ou entre l'entier de longueur et le multiplicateur K, Mou G . Par exemple, les spécifications suivantes sont toutes équivalentes et valides :
DBCLOB(50K) DBCLOB(50 K) DBCLOB (50 K) - Le multiplicateur K, Mou G peut être spécifié en majuscules ou en minuscules.
Dans une base de données Unicode, les unités de chaîne par défaut pour un type de données de chaîne de caractères sont déterminées par la valeur de la variable globale NLS_STRING_UNITS ou du paramètre de configuration de base de données string_units. Dans une base de données non Unicode, les unités de chaîne par défaut pour les types de données de type chaîne de caractères sont CODEUNITS16.
- CODEUNITS16
- Indique que les unités de l'attribut length sont des unités de code Unicode UTF-16 qui sont les mêmes que le comptage en octets doubles. CODEUNITS16 ne peut être spécifié que dans une base de données Unicode (SQLSTATE 560AA).
- CODEUNITS32
- Indique que les unités de l'attribut length sont des unités de code Unicode UTF-32. Cela n'affecte pas la page de codes sous-jacente du type de données. La longueur réelle d'une valeur de données est déterminée en comptant les unités de code UTF-32 comme si les données ont été converties en UTF-32. CODEUNITS32 ne peut être spécifié que dans une base de données Unicode (SQLSTATE 560AA).
- [NATIONAL CHARACTER | NATIONAL CHAR | NCHAR](integer)
- Chaîne de longueur fixe de la longueur spécifiée. La longueur par défaut est 1.
Le type CHARACTER NATIONAL est mappé à un caractère de longueur fixe ou à une chaîne graphique de longueur fixe, en fonction de la valeur du paramètre de configuration de base de données nchar_mapping, qui définit également les unités de chaîne.
- [NATIONAL CHARACTER VARYING | NATIONAL CHAR VARYING | NCHAR VARYING | NVARCHAR](integer)
- Chaîne de longueur variable de la longueur maximale spécifiée.
Le type NATIONAL CHARACTER VARYING est mappé à un caractère de longueur variable ou à une chaîne graphique de longueur variable, en fonction de la valeur du paramètre de configuration de base de données nchar_mapping, qui définit également les unités de chaîne.
- [NATIONAL CHARACTER LARGE OBJECT | NCHAR LARGE OBJECT | NCLOB](integer [K | M | G])
- Une chaîne d'objet LOB de la longueur maximale spécifiée.
Ce type de données est mappé à un objet CLOB (character large object ) ou à un objet LOB à deux octets (DBCLOB), en fonction de la valeur actuelle du paramètre de configuration de base de données nchar_mapping, qui définit également les unités de chaîne. Voir la description du paramètre CLOB ou DBCLOB (selon le cas) pour plus d'informations sur les valeurs possibles pour l'entier de longueur et pour savoir comment utiliser un multiplicateur K (kilo), M (mega) ou G (giga).
- BINARY(integer)
- Chaîne binaire de longueur fixe de la longueur spécifiée, qui doit être de 1 à 255 octets. La longueur par défaut est 1.
- [VARBINARY | BINARY VARYING](integer)
- Chaîne binaire de longueur variable de la longueur maximale spécifiée, qui doit être de 1 à 32 672 octets.
- [BLOB | BINARY LARGE OBJECT](integer [K | M | G])
- Une chaîne d'objet de grande taille binaire de la longueur maximale spécifiée. La valeur par défaut est 1 048 576 octets (1M).Si vous souhaitez multiplier l'entier de longueur par 1024 (kilo), 1 048 576 (méga) ou 1 073 741 824 (giga), spécifiez un multiplicateur K (kilo), M (méga) ou G (giga).
- Quel que soit le multiplicateur, le cas échéant, que vous utilisez, la longueur résultable est limitée par la longueur maximale d'une colonne BLOB, qui est de 2 147 483 647 octets. Si un multiple de K, M ou G dépasse légèrement cette longueur maximale (par exemple, 2G = 2 147 483 648), la longueur maximale est utilisée à la place.
- Tout nombre d'espaces (y compris les espaces nuls) est autorisé entre le type de données et la spécification de longueur ou entre l'entier de longueur et le multiplicateur K, Mou G . Par exemple, les spécifications suivantes sont toutes équivalentes et valides :
BLOB(50K) BLOB(50 K) BLOB (50 K) - Le multiplicateur K, Mou G peut être spécifié en majuscules ou en minuscules.
- DATE
- Une date.
- PÉRIODE
- Un heure.
- TIMESTAMP (Entier) ou TIMESTAMP
- Un horodatage. L'entier indique la précision des fractions de secondes de 0 (secondes) à 12 (picosecondes). La valeur par défaut est 6 (microsecondes).
- langage XML
- Document XML. Seuls les documents XML correctement formés peuvent être insérés dans une colonne XML.Une colonne XML comporte les restrictions suivantes :
- La colonne ne peut pas faire partie d'un index à l'exception d'un index sur des données XML. Par conséquent, elle ne peut pas être incluse comme colonne d'une clé primaire ou d'une contrainte unique (SQLSTATE 42962).
- La colonne ne peut pas être une clé externe d'une contrainte référentielle (SQLSTATE 42962).
- Une valeur par défaut (WITH DEFAULT) ne peut pas être spécifiée pour la colonne (SQLSTATE 42613). Si la colonne est indéfinie, la valeur par défaut de la colonne est la valeur null.
- La colonne ne peut pas être utilisée comme clé de distribution (SQLSTATE 42997).
- La colonne ne peut pas être utilisée comme clé de partitionnement de données (SQLSTATE 42962).
- La colonne ne peut pas être utilisée pour organiser une table de regroupement multidimensionnelle (MDC) (SQLSTATE 42962).
- La colonne ne peut pas être utilisée dans une table groupée par plage (SQLSTATE 429BG).
- La colonne ne peut pas être référencée dans une contrainte de vérification, sauf dans un prédicat VALIDATED (SQLSTATE 42621).
Lorsqu'une colonne de type XML est créée, un index de chemin XML est créé sur cette colonne. Un index de région XML au niveau table est également créé lors de la création de la première colonne de type XML. Le nom de ces index est
SQL
suivi d'un horodatage de type caractère (aammjjhhmmssxxx). Le nom de schéma est SYSIBM. - BOOLEAN
- Valeur booléenne.
- SYSPROC.DB2SECURITYLABEL
- Type distinct intégré qui doit être utilisé pour définir la colonne d'étiquette de sécurité de ligne d'une table protégée. Le type de données sous-jacent d'une colonne du type distinct intégré DB2SECURITYLABEL est VARCHAR (128) FOR BIT DATA. Une table peut avoir au plus une colonne de type DB2SECURITYLABEL (SQLSTATE 428C1).
distinct-type-name - Pour un type défini par l'utilisateur qui est un type distinct. Si un nom de type distinct est spécifié sans nom de schéma, le nom de type distinct est résolu en recherchant les schémas sur le chemin SQL (défini par l'option de prétraitement FUNCPATH pour SQL statique et par le registre CURRENT PATH pour SQL dynamique).
Si une colonne est définie à l'aide d'un type distinct, le type de données de la colonne est le type distinct. La longueur et l'échelle de la colonne sont la longueur et l'échelle du type de source du type distinct. Le type distinct indiqué ne peut pas avoir de contraintes de type de données et le type de source ne peut pas être un type de données ancré (SQLSTATE 428H2).
Si une colonne définie à l'aide d'un type distinct est une clé externe d'une contrainte référentielle, le type de données de la colonne correspondante de la clé primaire doit avoir le même type distinct.
structured-type-name - Pour un type défini par l'utilisateur qui est un type structuré. Si un nom de type structuré est spécifié sans nom de schéma, le nom du type structuré est résolu en recherchant les schémas sur le chemin SQL (défini par l'option de prétraitement FUNCPATH pour SQL statique, et par le registre CURRENT PATH pour SQL dynamique).
Si une colonne est définie à l'aide d'un type structuré, le type de données statique de la colonne est le type structuré. La colonne peut inclure des valeurs avec un type dynamique qui est un sous-type de structured-type-name.
Une colonne définie à l'aide d'un type structuré ne peut pas être utilisée dans une clé primaire, une contrainte unique, une clé externe, une clé d'index ou une clé de distribution (SQLSTATE 42962).
Si une colonne est définie à l'aide d'un type structuré et qu'elle contient un attribut de type de référence à n'importe quel niveau d'imbrication, cet attribut de type de référence n'est pas sectorisé. Pour utiliser un tel attribut dans une opération de déréférencement, il est nécessaire de spécifier explicitement une SCOPE à l'aide d'une spécification CAST.
- REF (type-name2)
- Pour une référence à une table basée sur un type structuré. Si type-name2 est spécifié sans nom de schéma, le nom du type est résolu en recherchant les schémas sur le chemin SQL (défini par l'option de prétraitement FUNCPATH pour SQL statique et par le registre CURRENT PATH pour SQL dynamique). Le type de données sous-jacent de la colonne est basé sur le type de données de représentation spécifié dans la clause REF USING de l'instruction CREATE TYPE pour type-name2 ou le type racine de la hiérarchie de types de données qui inclut type-name2.
column-options - L'un des types de données intégrés suivants :
- Définit les options supplémentaires associées aux colonnes de la table.
- NOT NULL
- Empêche la colonne de contenir des valeurs NULL.
Si NOT NULL n'est pas spécifié, la colonne peut contenir des valeurs NULL et sa valeur par défaut est soit la valeur NULL, soit la valeur fournie par la clause WITH DEFAULT.
- Indique si la colonne doit être définie comme masquée. L'attribut caché détermine si la colonne est incluse dans une référence implicite à la table ou si elle peut être explicitement référencée dans des instructions SQL. La valeur par défaut est NOT HIDDEN.
- Indique que la colonne est incluse dans les références implicites de la table et que la colonne peut être explicitement référencée.
- Indique que la colonne n'est pas visible dans les instructions SQL, sauf si la colonne est explicitement référencée par son nom. Par exemple, si une table inclut une colonne définie avec la clause IMPLICITLY HIDDEN, le résultat d'une instruction SELECT * n'inclut pas la colonne implicitement masquée. Cependant, le résultat d'une instruction SELECT qui fait explicitement référence au nom d'une colonne implicitement masquée inclut cette colonne dans la table de résultats.
IMPLICITLY HIDDEN ne doit pas être spécifié pour toutes les colonnes de la table (SQLSTATE 428GU).
lob-options - Spécifie les options pour les types de données LOB.
- LOGGED
- Indique que les modifications apportées à la colonne doivent être écrites dans le journal. Les données de ces colonnes sont ensuite récupérables avec les utilitaires de base de données (tels que RESTORE DATABASE). LOGGED est la valeur par défaut.
- NOT LOGGED
- Indique que les modifications apportées à la colonne ne doivent pas être consignées. Cela s'applique uniquement aux données LOB qui ne sont pas en ligne.
NOT LOGGED n'a aucun effet sur une opération de validation ou d'annulation, c'est-à-dire que la cohérence de la base de données est maintenue, même si une transaction est annulée, que la valeur LOB soit consignée ou non. L'implication de ne pas se connecter est qu'au cours d'une opération de récupération aval, après une opération de sauvegarde ou de chargement, les données LOB sont remplacées par des zéros pour les valeurs LOB qui auraient eu des enregistrements de journal relus lors de la récupération aval. Lors de la reprise sur incident, tous les changements validés et les modifications annulées reflètent les résultats attendus.
- COMPACT
- Indique que les valeurs de la colonne LOB doivent occuper un espace disque minimal (libérer toutes les pages de disque supplémentaires du dernier groupe utilisées par la valeur LOB), plutôt que de laisser un espace de gauche à la fin de la zone de stockage LOB qui pourrait faciliter les opérations d'ajout ultérieures. Le stockage de données de cette manière peut réduire les performances des opérations d'ajout (augmentation de la longueur) sur la colonne.
- NON COMPACT
- Indique un espace pour les insertions, afin de faciliter les modifications futures des valeurs LOB dans la colonne. Il s'agit de la valeur par défaut.
- SCOPE
- Identifie la portée de la colonne de type de référence.
Une portée doit être spécifiée pour toute colonne destinée à être utilisée comme opérande de gauche d'un opérateur de déréférencement ou comme argument de la fonction DEREF. La spécification de la portée d'une colonne de type de référence peut être différée dans une instruction ALTER TABLE ultérieure pour permettre la définition de la table cible, généralement lors du référencement des tables.
- typed-table-name
- Nom d'une table basée sur un type structuré. La table doit déjà exister ou être identique au nom de la table en cours de création (SQLSTATE 42704). Les données de type column-name doivent être REF(S), où S est le type de typed-table-name (SQLSTATE 428DM). Aucune vérification n'est effectuée sur les valeurs affectées à column-name pour vérifier que les valeurs référencont réellement les lignes existantes dans typed-table-name. typed-view-name
- Nom d'une vue basée sur un type structuré La vue doit déjà exister ou être identique au nom de la vue en cours de création (SQLSTATE 42704). Les données de type column-name doivent être REF(S), où S est le type de typed-table-name (SQLSTATE 428DM). Aucune vérification n'est effectuée sur les valeurs affectées à column-name pour vérifier que les valeurs référencont réellement les lignes existantes dans typed-table-name.
- CONSTRAINT constraint-name
- Nomme la contrainte. Un nom de contrainte ne doit pas identifier une contrainte qui était déjà spécifiée dans la même instruction CREATE TABLE. (SQLSTATE 42710).
Si cette clause est omise, un identificateur de 18 octets qui est unique parmi les identificateurs des contraintes existantes définies sur la table est généré par le système. (L'identificateur se compose de
SQL
suivi d'une séquence de 15 caractères numériques générés par une fonction basée sur l'horodatage).Lorsqu'il est utilisé avec une contrainte PRIMARY KEY ou UNIQUE, le nom de contrainte peut être utilisé comme nom d'un index créé pour prendre en charge la contrainte.
- CLE PRIMAIRE
- Fournit une méthode abrégée de définition de clé primaire composée d'une seule colonne. Par conséquent, si PRIMARY KEY est spécifié dans la définition de la colonne C, l'effet est le même que si la clause PRIMARY KEY(C) est spécifiée en tant que clause distincte.
Une clé primaire ne peut pas être spécifiée si la table est une sous-table (SQLSTATE 429B3), car la clé primaire est héritée de la supertable.
Une colonne TIMESTAMP ROW CHANGE ne peut pas être utilisée comme élément d'une clé primaire (SQLSTATE 429BV).
Les colonnes Row-begin, row-end, and transaction-start-ID ne peuvent pas être utilisées comme élément d'une clé primaire (SQLSTATE 429BV).
Voir PRIMARY KEY dans la description unique-constraint.
- UNIQUE
- Fournit une méthode abrégée de définition d'une clé unique composée d'une seule colonne. Ainsi, si UNIQUE est spécifié dans la définition de la colonne C, l'effet est le même que si la clause UNIQUE(C) est spécifiée en tant que clause distincte.
Une contrainte unique ne peut pas être spécifiée si la table est une sous-table (SQLSTATE 429B3), car des contraintes uniques sont héritées de la supertable.
Voir UNIQUE dans la description unique-constraint.
references-clause - Fournit une méthode abrégée de définition d'une clé externe composée d'une seule colonne. Ainsi, si une clause de référence est spécifiée dans la définition de la colonne C, l'effet est le même que si cette clause de référence était spécifiée dans une clause FOREIGN KEY dans laquelle C est la seule colonne identifiée.
Voir references-clause sous la description referential-constraint.
- CHECK (check-condition)
- Fournit une méthode abrégée de définition d'une contrainte de vérification qui s'applique à une seule colonne. Voir la description de CHECK (check-condition). default-clause
- Indique une valeur par défaut pour la colonne.
- WITH
- Mot clé facultatif.
- DEFAULT
Fournit une valeur par défaut si une valeur n'est pas fournie sur l'insertion ou est définie comme DEFAULT sur INSERT ou UPDATE. Si une valeur par défaut n'est pas spécifiée à la suite du mot clé DEFAULT, la valeur par défaut dépend du type de données de la colonne, comme indiqué dans
ALTER TABLE
. Cette clause ne doit pas être spécifiée avec la clause générée dans une définition de colonne (SQLSTATE 42614).Si une colonne est définie comme XML, une valeur par défaut ne peut pas être spécifiée (SQLSTATE 42613). La seule valeur par défaut possible est NULL.
Si la colonne est basée sur une colonne d'une table basée sur un type structuré, une valeur par défaut spécifique doit être spécifiée lors de la définition d'une valeur par défaut. Une valeur par défaut ne peut pas être spécifiée pour la colonne d'identificateur d'objet d'une table basée sur un type structuré (SQLSTATE 42997).
Si une colonne est définie à l'aide d'un type distinct, la valeur par défaut de la colonne est la valeur par défaut du type de données source dans le type distinct.
Si une colonne est définie à l'aide d'un type structuré, default-clause ne peut pas être spécifié (SQLSTATE 42842).
L'omission de DEFAULT à partir d'une définition de colonne entraîne l'utilisation de la valeur null comme valeur par défaut de la colonne. Si une telle colonne est définie NOT NULL, la colonne n'a pas de valeur par défaut valide.
default-values- Les types spécifiques de valeurs par défaut qui peuvent être spécifiés sont les suivants .
- constant
- Indique la constante comme valeur par défaut de la colonne. La constante spécifiée doit respecter ce qui suit :
- Représenter une valeur qui peut être attribuée à la colonne conformément aux règles d'affectation.
- Ne pas être ne constante à virgule flottante, sauf si la colonne est définie avec un type de données à virgule flottante.
- Êtte une constante numérique ou une valeur spéciale décimale à virgule flottante si le type de données de la colonne est un virgule flottante décimale. Les constantes à virgule flottante sont d'abord interprétées comme DOUBLE, puis converties en virgule flottante décimale si la colonne cible est DECFLOAT. Pour les colonnes DECFLOAT(16), les constantes décimales d'une précision supérieure à 16 chiffres sont arrondies à l'aide des modes d'arrondi spécifiés par le registre spécial CURRENT DECFLOAT ROUNDING MODE.
- Ne pas avoir de chiffres différents de zéro au-delà de l'échelle du type de données de colonne si la constante est une constante décimale (par exemple, 1.234 ne peut pas être la valeur par défaut pour une colonne DECIMAL (5, 2)).
- Exprimées avec 254 octets maximum, y compris les guillemets, le caractère introducteur tel que le X pour une constante hexadécimale, les caractères du nom de fonction complet et les parenthèses lorsque la constante est l'argument d'une fonction de transtypage
datetime-special-register - Indique la valeur du registre spécial de date et d'heure (CURRENT DATE, CURRENT TIME ou CURRENT TIMESTAMP) au moment de INSERT, UPDATE ou LOAD comme valeur par défaut de la colonne. Le type de données de la colonne doit être le type de données correspondant au registre spécial spécifié (par exemple, le type de données doit être DATE lorsque CURRENT DATE est spécifié). user-special-register
- Indique la valeur du registre spécial de l'utilisateur (CURRENT USER, SESSION_USER, SYSTEM_USER) au moment de INSERT, UPDATE ou LOAD comme valeur par défaut de la colonne. Le type de données de la colonne doit être une chaîne de caractères dont la longueur n'est pas inférieure à l'attribut de longueur d'un registre spécial utilisateur. USER peut être spécifié à la place de SESSION_USER et CURRENT_USER peut être spécifié à la place de CURRENT USER.
- CURRENT SCHEMA
- Indique la valeur du registre spécial CURRENT SCHEMA au moment de l'instruction INSERT, UPDATE ou LOAD comme valeur par défaut de la colonne. Si CURRENT SCHEMA est indiqué, le type de données de la colonne doit être une chaîne de caractères dont la longueur est supérieure ou égale à l'attribut de longueur du registre spécial CURRENT SCHEMA.
- CURRENT MEMBER
- Indique la valeur du registre spécial CURRENT MEMBER au moment de l'instruction INSERT, UPDATE ou LOAD comme valeur par défaut de la colonne. Si CURRENT MEMBER est indiqué, le type de données de la colonne doit permettre l'affectation à partir d'un entier.
- NULL
- Indique la valeur NULL comme valeur par défaut pour la colonne. Si NOT NULL a été spécifié, la valeur DEFAULT NULL peut être spécifiée dans la même définition de colonne, mais génère une erreur sur toute tentative de définition de la valeur par défaut de la colonne. cast-function
- Cette forme de valeur par défaut ne peut être utilisée qu'avec les colonnes définies comme type de données de type distinct, BLOB ou datetime (DATE, TIME ou TIMESTAMP). Pour un type distinct, à l'exception des types distincts basés sur les types BLOB ou datetime, le nom de la fonction doit correspondre au nom du type distinct de la colonne. S'il est qualifié avec un nom de schéma, il doit être identique au nom de schéma pour le type distinct. S'il n'est pas qualifié, le nom de schéma de la résolution de la fonction doit être identique au nom de schéma pour le type distinct. Pour un type distinct basé sur un type date/heure, où la valeur par défaut est une constante, une fonction doit être utilisée et le nom de la fonction doit correspondre au nom du type de source du type distinct avec un nom de schéma implicite ou explicite de SYSIBM. Pour les autres colonnes de date et d'heure, la fonction datetime correspondante peut également être utilisée. Pour un type BLOB ou un type distinct basé sur BLOB, une fonction doit être utilisée et le nom de la fonction doit être BLOB avec un nom de schéma implicite ou explicite de SYSIBM.
- constant
- Indique une constante comme argument. La constante doit être conforme aux règles d'une constante pour le type de source du type distinct ou pour le type de données si ce n'est pas un type distinct. Si cast-function est BLOB, la constante doit être une constante de type chaîne. datetime-special-register
- Indique CURRENT DATE, CURRENT TIME ou CURRENT TIMESTAMP. Le type de source du type distinct de la colonne doit être le type de données correspondant au registre spécial spécifié. user-special-register
- Indique CURRENT USER, SESSION_USER ou SYSTEM_USER. Le type de données du type source du type distinct de la colonne doit être un type de données de type chaîne d'une longueur d'au moins 8 octets. Si cas-function est BLOB, l'attribut de longueur doit être d'au moins 8 octets.
- CURRENT SCHEMA
- Indique la valeur du registre spécial CURRENT SCHEMA. Le type de données du type source du type distinct de la colonne doit être une chaîne de caractères d'une longueur supérieure ou égale à l'attribut de longueur du registre spécial CURRENT SCHEMA. Si cast-function est BLOB, l'attribut de longueur doit être d'au moins 8 octets.
- EMPTY_CLOB(), EMPTY_DBCLOB() ou EMPTY_BLOB()
- Indique une chaîne de longueur zéro comme valeur par défaut de la colonne. La colonne doit avoir le type de données correspondant au type de données de résultat de la fonction.
Si la valeur spécifiée n'est pas valide, une erreur est renvoyée (SQLSTATE 42894).
- Indique la constante comme valeur par défaut de la colonne. La constante spécifiée doit respecter ce qui suit :
generated-clause - Indique une valeur générée pour la colonne.
- GENERATED
Indique que la base de données génère des valeurs pour la colonne. GENERATED doit être spécifié si la colonne doit être considérée comme une colonne d'identité ou une colonne d'horodatage de modification de ligne, une colonne de début de ligne, une colonne de fin de ligne, une colonne d' ID de début de transaction ou une colonne d'expression générée. Une clause par défaut ne doit pas être spécifiée pour une colonne définie comme GENERATED (SQLSTATE 42623).
- ALWAYS
- Indique qu'une valeur est toujours générée pour la colonne lorsqu'une ligne est insérée dans la table ou que la valeur de résultat de l'expression de génération change. Le résultat de l'expression est stocké dans la table. GENERATED ALWAYS est la valeur recommandée, sauf si des opérations de propagation ou de déchargement et de rechargement des données sont effectuées. GENERATED ALWAYS est la valeur requise pour les colonnes générées.
- BY DEFAULT
- Indique que la base de données génère une valeur pour la colonne lorsqu'une ligne est insérée ou mise à jour en spécifiant la clause DEFAULT, sauf si une valeur explicite est spécifiée. PAR DEFAUT est la valeur recommandée lors de l'utilisation de la propagation des données ou de l'exécution d'une opération de déchargement et de rechargement.
Bien que non explicitement requis, pour garantir l'unicité des valeurs, définissez un index à colonne unique unique sur les colonnes IDENTITY générées.
- AS IDENTITY
- Indique que la colonne doit être la colonne d'identité de cette table. Une table ne peut avoir qu'une seule colonne d'identité (SQLSTATE 428C1). Le mot clé IDENTITY ne peut être spécifié que si le type de données associé à la colonne est un type numérique exact avec une échelle de zéro, ou un type distinct défini par l'utilisateur pour lequel le type de source est un type numérique exact avec une échelle de zéro (SQLSTATE 42815). SMALLINT, INTEGER, BIGINT ou DECIMAL avec une échelle de zéro, ou un type distinct basé sur l'un de ces types, sont considérés comme des types numériques exacts. En revanche, les virgules flottantes à notation simple et double sont considérés comme des types de données numériques approximatifs. Les types de référence, même s'ils sont représentés par un type numérique exact, ne peuvent pas être définis en tant que colonnes d'identité.
Une colonne d'identité est implicitement NOT NULL. Une colonne d'identité ne peut pas avoir une clause DEFAULT (SQLSTATE 42623).
- START WITH numeric-constant
- Indique la première valeur de la colonne d'identité. Cette valeur peut être n'importe quelle valeur positive ou négative qui peut être affectée à cette colonne (SQLSTATE 42815), sans chiffres différents de zéro existants à la droite du séparateur décimal (SQLSTATE 428FA). La valeur par défaut est MINVALUE pour les séquences croissantes et MAXVALUE pour les séquences descendantes. Cette valeur n'est pas nécessairement la valeur qui doit être générée après avoir atteint la valeur maximale ou minimale de la colonne d'identité. La clause START WITH peut être utilisée pour démarrer la génération de valeurs en dehors de la plage utilisée pour les cycles. La plage utilisée pour les cycles est définie par MINVALUE et MAXVALUE.
- INCREMENT BY numeric-constant
- Indique l'intervalle entre les valeurs consécutives de la colonne d'identité. Cette valeur peut être n'importe quelle valeur positive ou négative qui peut être affectée à cette colonne (SQLSTATE 42815) et ne dépasse pas la valeur d'une constante entière de type entier (SQLSTATE 42820), sans chiffres différents de zéro à droite du séparateur décimal (SQLSTATE 428FA).
Si cette valeur est négative, il s'agit d'une séquence descendante. Si cette valeur est 0, ou positive, il s'agit d'une séquence ascendante. Par défaut, il s'agit de 1.
- NO MINVALUE ou MINVALUE
- Indique la valeur minimale à partir de laquelle une colonne d'identité descendante génère ou cesse de générer des valeurs, ou un cycle de colonnes d'identité ascendante, après avoir atteint la valeur maximale.
- NO MINVALUE
- Pour une séquence ascendante, la valeur est la valeur START WITH, ou 1 si START WITH n'a pas été spécifié. Pour une séquence descendante, la valeur est la valeur minimale du type de données de la colonne. Il s'agit de la valeur par défaut.
- MINVALUE numeric-constant
- Indique la constante numérique qui est la valeur minimale. Cette valeur peut être une valeur positive ou négative qui peut être affectée à cette colonne (SQLSTATE 42815), sans chiffres différents de zéro à droite du séparateur décimal (SQLSTATE 428FA), mais la valeur doit être inférieure ou égale à la valeur maximale (SQLSTATE 42815).
- NO MAXVALUE ou MAXVALUE
- Indique la valeur maximale à laquelle une colonne d'identité ascendante génère ou cesse de générer des valeurs, ou un cycle de colonne d'identité décroissant après avoir atteint la valeur minimale.
- NO MAXVALUE
- Pour une séquence ascendante, la valeur est la valeur maximale du type de données de la colonne. Pour une séquence descendante, la valeur est la valeur START WITH, ou -1 si START WITH n'a pas été spécifié. Il s'agit de la valeur par défaut.
- MAXVALUE numeric-constant
- Indique la constante numérique qui est la valeur maximale. Cette valeur peut être n'importe quelle valeur positive ou négative qui peut être affectée à cette colonne (SQLSTATE 42815), sans chiffres différents de zéro à droite du séparateur décimal (SQLSTATE 428FA), mais la valeur doit être supérieure ou égale à la valeur minimale (SQLSTATE 42815).
- NO CYCLE ou CYCLE
- Indique si cette colonne d'identité doit continuer à générer des valeurs après avoir généré sa valeur maximale ou minimale.
- NO CYCLE
- Indique que les valeurs ne sont pas générées pour la colonne d'identité une fois la valeur maximale ou minimale atteinte. Il s'agit de la valeur par défaut.
- CYCLE
- Indique que les valeurs continuent d'être générées pour cette colonne une fois la valeur maximale ou minimale atteinte. Si cette option est utilisée, après qu'une colonne d'identité ascendante atteint la valeur maximale, elle génère sa valeur minimale, ou après qu'une séquence descendante atteint la valeur minimale, elle génère sa valeur maximale. Les valeurs maximale et minimale de la colonne d'identité déterminent la plage utilisée pour le cycle.
Lorsque CYCLE est en vigueur, des valeurs en double peuvent être générées pour une colonne d'identité. Bien qu'il ne soit pas explicitement requis, un index unique à colonne unique doit être défini dans la colonne générée pour garantir l'unicité des valeurs, si des valeurs uniques sont requises. Si un index unique existe sur une telle colonne d'identité et qu'une valeur non unique est générée, une erreur se produit (SQLSTATE 23505).
- NO CACHE ou CACHE
- Indique s'il faut conserver certaines valeurs préallouées en mémoire pour un accès plus rapide. Si une nouvelle valeur est nécessaire pour la colonne d'identité et qu'aucune n'est disponible dans le cache, la fin du nouveau bloc de cache doit être consignée. Toutefois, lorsqu'une nouvelle valeur est nécessaire pour la colonne d'identité et qu'une valeur inutilisée existe dans le cache, l'allocation de cette valeur d'identité est plus rapide, car aucune consignation n'est nécessaire. Il s'agit d'une option de performances et d'optimisation.
- NO CACHE
- Indique que les valeurs de la colonne d'identité ne doivent pas être préallouées.
Lorsque cette option est spécifiée, les valeurs de la colonne d'identité ne sont pas stockées dans le cache. Dans ce cas, chaque demande d'une nouvelle valeur d'identité entraîne une entrée-sortie synchrone dans le journal.
- CACHE integer-constant
- Indique le nombre de valeurs de la séquence d'identité à allouer et à conserver en mémoire. Lorsque des valeurs sont générées pour la colonne d'identité, la préallocation et le stockage des valeurs dans le cache réduit les entrées-sorties synchrones dans le journal.
Si une nouvelle valeur est nécessaire pour la colonne d'identité et qu'aucune valeur inutilisée n'est disponible dans le cache, l'allocation de la valeur implique l'attente d'E-S dans le journal. Toutefois, lorsqu'une nouvelle valeur est nécessaire pour la colonne d'identité et qu'une valeur inutilisée existe dans le cache, l'allocation de cette valeur d'identité peut se produire plus rapidement en évitant les entrées-sorties dans le journal.
La valeur minimale est 2 (SQLSTATE 42815). La valeur par défaut est CACHE 20.
Utilisez les options CACHE et NO ORDER pour autoriser simultanément plusieurs caches de valeurs d'identité. Dans un environnement multipartition ou Db2 pureScale®, plusieurs membres peuvent les mettre en cache.
Dans un environnement Db2® pureScale si CACHE et ORDER sont tous deux spécifiés, la spécification de ORDER l'emporte sur celle de CACHE et c'est NO CACHE qui s'applique.
- NO ORDER ou ORDER
- Indique si les valeurs d'identité doivent être générées par ordre de demande.
- NO ORDER
- Indique que les valeurs n'ont pas besoin d'être générées dans l'ordre de demande. Il s'agit de la valeur par défaut.
- ORDRE
- Indique que les valeurs doivent être générées par ordre de demande.
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- Indique que la colonne est une colonne d'horodatage pour la table. Une valeur est générée pour la colonne de chaque ligne insérée et pour toute ligne dans laquelle une colonne est mise à jour. La valeur générée pour une colonne ROW CHANGE TIMESTAMP est un horodatage correspondant à l'heure d'insertion ou de mise à jour de cette ligne. Si plusieurs lignes sont insérées ou mises à jour avec une seule instruction, la valeur de la colonne ROW CHANGE TIMESTAMP peut être différente pour chaque ligne.
Une table ne peut avoir qu'une seule colonne ROW CHANGE TIMESTAMP (SQLSTATE 428C1). Si le type de données est spécifié, il doit être TIMESTAMP ou TIMESTAMP(6) (SQLSTATE 42842). Une colonne TIMESTAMP ROW CHANGE ne peut pas avoir une clause DEFAULT (SQLSTATE 42623). NOT NULL doit être spécifié pour une colonne ROW CHANGE TIMESTAMP (SQLSTATE 42831).
- AS (generation-expression)
- Indique que la définition de la colonne est basée sur une expression. (Si l'expression d'une colonne GENERATED ALWAYS inclut une fonction externe définie par l'utilisateur, la modification de l'exécutable de la fonction (de sorte que les résultats changent pour des arguments donnés) peut entraîner des données incohérentes. Cela peut être évité en utilisant l'instruction SET INTEGRITY pour forcer la génération de nouvelles valeurs). L'expression de génération ne peut contenir aucun des éléments suivants (SQLSTATE 42621) :
- Sous-requête
- Expressions XMLQUERY ou XMLEXISTS
- Fonctions de colonne
- Opérations de déréférencement ou fonctions DEREF
- Fonctions définies par l'utilisateur ou intégrées non déterministes
- Fonctions définies par l'utilisateur qui utilisent l'option EXTERNAL ACTION
- Fonctions définies par l'utilisateur qui ne sont pas définies avec NO SQL
- Variables hôte ou marqueurs de paramètre
- Registres spéciaux et fonctions intégrées qui dépendent de la valeur d'un registre spécial
- Variables globales
- Références aux colonnes définies ultérieurement dans la liste des colonnes
- Références à d'autres colonnes générées
- Références aux colonnes de type XML
Le type de données de la colonne est basé sur le type de données de résultat de l'expression de génération. Une spécification CAST peut être utilisée pour forcer un type de données particulier et pour fournir une portée (pour un type de référence uniquement). Si le type de données est spécifié, les valeurs sont affectées à la colonne en fonction des règles d'affectation appropriées. Une colonne générée est considérée comme indéfinie, sauf si l'option de colonne NOT NULL est spécifiée. L'égalité entre le type de données d'une colonne générée et le type de données du résultat de l'expression de génération doit être définie (voir
Affectations et comparaisons
). Cela exclut les colonnes et les expressions de génération de types de données LOB, XML, de types structurés et de types distincts basés sur l'un de ces types (SQLSTATE 42962). - AS ROW BEGIN
Indique que la valeur générée est affectée par le gestionnaire de base de données chaque fois qu'une ligne est insérée dans la table ou qu'une colonne de la ligne est mise à jour. La valeur est générée en utilisant une lecture de l'horloge de l'heure du jour pendant l'exécution de la première instruction de modification des données dans la transaction qui nécessite l'attribution d'une valeur à la colonne row-begin ou à la colonne transaction-start-ID dans la table, ou la suppression d'une ligne dans une table temporelle de période système.
Pour une table temporelle de période système, le gestionnaire de base de données garantit l'unicité des valeurs générées pour une colonne de début de ligne pour les transactions. La valeur de l'horodatage peut être ajustée pour s'assurer que les lignes insérées dans une table d'historique associée ont la valeur d'horodatage de fin supérieure à la valeur d'horodatage de début. Cela peut se produire lorsqu'une transaction en conflit met à jour la même ligne dans la table temporelle de la période système. Le paramètre de configuration de base de données systime_period_adj doit avoir la valeur Yes pour cet ajustement à la valeur d'horodatage à effectuer. Si plusieurs lignes sont insérées ou mises à jour dans une seule transaction SQL et qu'un ajustement n'est pas nécessaire, les valeurs de la colonne de début de ligne sont identiques pour toutes les lignes et sont uniques à partir des valeurs générées pour la colonne pour une autre transaction. Une colonne de début de ligne est requise en tant que colonne de début d'une période SYSTEM_TIME, qui est l'utilisation prévue pour ce type de colonne générée.
Une table ne peut avoir qu'une seule colonne de début de ligne (SQLSTATE 428C1). Si le type de données n'est pas spécifié, la colonne est définie en tant que TIMESTAMP(12). Si le type de données est spécifié, il doit s'agir de TIMESTAMP(12) (SQLSTATE 42842). La colonne ne peut pas avoir la clause DEFAULT (SQLSTATE 42623) et doit être définie comme NOT NULL (SQLSTATE 42831). Une colonne de début de ligne n'est pas mise à jour.
- AS ROW END
Indique qu'une valeur pour le type de données de la colonne est affectée par le gestionnaire de base de données chaque fois qu'une ligne est insérée ou qu'une colonne de la ligne est mise à jour. La valeur affectée est TIMESTAMP
9999-12-30-00.00.00.000000000000
.Une colonne de fin de ligne est requise en tant que deuxième colonne d'une période SYSTEM_TIME, qui est l'utilisation prévue pour ce type de colonne générée.
Une table ne peut avoir qu'une seule colonne de fin de ligne (SQLSTATE 428C1). Si le type de données n'est pas spécifié, la colonne est définie comme TIMESTAMP(12). Si le type de données est spécifié, il doit s'agir de TIMESTAMP(12) (SQLSTATE 42842). La colonne ne peut pas avoir la clause DEFAULT (SQLSTATE 42623) et doit être définie comme NOT NULL (SQLSTATE 42831). Une colonne de fin de ligne n'est pas mise à jour.
- AS TRANSACTION START ID
Indique que la valeur est affectée par le gestionnaire de base de données chaque fois qu'une ligne est insérée dans la table ou qu'une colonne de la ligne est mise à jour. Le gestionnaire de base de données affecte une valeur d'horodatage unique par transaction ou la valeur null. La valeur NULL est affectée à la colonne transaction-start-ID si la colonne est peut prendre une valeur null et s'il existe une colonne de début de ligne dans la table pour laquelle la valeur n'a pas besoin d'être ajustée. Sinon, la valeur est générée en utilisant une lecture de l'horloge de l'heure du jour pendant l'exécution de la première instruction de changement de données dans la transaction qui exige qu'une valeur soit attribuée à une colonne de début de ligne ou à une colonne d'ID de début de transaction dans la table, ou une ligne dans une table temporelle de période système est supprimée. Si plusieurs lignes sont insérées ou mises à jour dans une seule transaction SQL, les valeurs de la colonne transaction-start-ID sont les mêmes pour toutes les lignes et sont uniques par rapport aux valeurs générées pour la colonne dans une autre transaction.
Une colonne transaction-start-ID est requise pour une table temporelle de période système, qui est l'utilisation prévue pour ce type de colonne générée.
Une table ne peut avoir qu'une seule colonne transaction-start-ID (SQLSTATE 428C1). Si le type de données n'est pas spécifié, la colonne est définie comme TIMESTAMP(12). Si le type de données est spécifié, il doit s'agir de TIMESTAMP(12). Une colonne transaction-start-ID ne peut pas avoir de clause DEFAULT (SQLSTATE 42623). Une colonne transaction-start-ID n'est pas mise à jour.
- INLINE LENGTH integer
- Cette option est valide uniquement pour une colonne définie à l'aide d'un type structuré, XML ou LOB (SQLSTATE 42842).
Pour une colonne de type de données XML ou LOB, integer indique la taille d'octet maximale de la représentation interne d'un document XML ou de données LOB à stocker dans la ligne de la table de base. Les documents XML ayant une représentation interne plus grande sont stockés séparément de la ligne de la table de base dans un objet de mémoire secondaire. Cela se produit automatiquement. Il n'existe pas de longueur en ligne par défaut pour les colonnes de type XML. Si le document XML ou les données LOB sont stockés dans la ligne de la table de base, il existe une surcharge. Pour les données LOB, la surcharge est de 4 octets.
Pour une colonne de type de données LOB, la longueur en ligne par défaut est définie comme la taille maximale du descripteur LOB si la clause n'est pas spécifiée. Toute instruction LENGTH INLINE explicite doit correspondre au moins la taille maximale du descripteur LOB. Le tableau suivant récapitule les tailles des descripteurs LOB.Tableau 1. Taille du descripteur LOB pour diverses longueurs LOB. Longueur maximale de l'objet LOB en octets Valeur minimale d'INLINE LENGTH 1,024 68 8 192 92 65 536 116 524 000 140 4 190 000 164 134 000 000 196 536 000 000 220 1 070 000,000 252 1 470 000,000 276 2,147,483,647 312 Pour une colonne de type structuré, integer indique la taille maximale en octets d'une instance d'un type structuré à stocker en ligne avec le reste des valeurs de la ligne. Les instances de types structurés qui ne peuvent pas être stockées en ligne sont stockées séparément de la ligne de la table de base, similaire à la façon dont les valeurs LOB sont stockées. Cela se produit automatiquement. La valeur par défaut INLINE LENGTH pour une colonne de type structuré est la longueur en ligne de son type (spécifié explicitement ou par défaut dans l'instruction CREATE TYPE). Si INLINE LENGTH du type structuré est inférieur à 292, la valeur 292 est utilisée pour l'INLINE LENGTH de la colonne.Remarque: les longueurs en ligne des sous-types ne sont pas comptées dans la longueur en ligne par défaut, ce qui signifie que les instances de sous-types peuvent ne pas tenir en ligne sauf si une valeur INLINE LENGTH explicite est spécifiée au moment de l'instruction CREATE TABLE pour prendre en compte les sous-types existants et futurs.La valeur explicite INLINE LENGTH ne peut pas dépasser 32 673. Pour un type structuré ou un type de données XML, elle doit être au moins 292 (SQLSTATE 54010).
- COMPRESS SYSTEM DEFAULT
- Indique que les valeurs par défaut du système doivent être stockées à l'aide d'un espace minimal. Si la clause VALUE COMPRESSION n'est pas spécifiée, un avertissement est renvoyé (SQLSTATE 01648) et les valeurs par défaut du système ne sont pas stockées à l'aide d'un espace minimal.
Le fait d'autoriser le stockage de valeurs par défaut du système entraîne une légère pénalité de performance lors des opérations d'insertion et de mise à jour sur la colonne en raison de la vérification supplémentaire effectuée.
Le type de données de base ne doit pas être un type de données DATE, TIME, TIMESTAMP, XML ou structuré (SQLSTATE 42842). Si le type de données de base est une chaîne de longueur variable, cette clause est ignorée. Les valeurs de chaîne de longueur 0 sont automatiquement compressées si une table a été définie avec VALUE COMPRESSION.
- COLUMN SECURED WITH security-label-name
- Identifie une étiquette de sécurité existante pour la politique de sécurité associée à la table. Le nom ne doit pas être qualifié (SQLSTATE 42601). La table doit être associée à une politique de sécurité (SQLSTATE 55064). La table ne doit pas être une table temporelle de période système.
En général, vous n'êtes pas autorisé à protéger les données de telle sorte que vos données d'identification LBAC ne vous permettent pas d'écrire dans ces données. Pour protéger une colonne avec une étiquette de sécurité particulière, vous devez disposer de données d'identification LBAC qui vous permettent d'écrire dans les données protégées par cette étiquette de sécurité. Vous n'avez pas besoin de disposer des droits SECADM.
period-definition - Nomme une colonne de la table. Le nom ne peut pas être qualifié et le même nom ne peut pas être utilisé pour plus d'une colonne de la table (SQLSTATE 42711).
- PERIOD
- Définit une période pour la table.
- SYSTEM_TIME (begin-column-name, end-column-name)
Définit une période système avec le nom SYSTEM_TIME. La table ne doit pas contenir de colonne portant le nom SYSTEM_TIME (SQLSTATE 42711). Une table ne peut avoir qu'une seule période SYSTEM_TIME (SQLSTATE 42711). begin-column-name doit être défini en tant que ROW BEGIN et end-column-name doit être défini en tant que ROW END (SQLSTATE 428HN).
- BUSINESS_TIME (begin-column-name, end-column-name)
Définit une période d'application portant le nom BUSINESS_TIME. La table ne doit pas contenir de colonne portant le nom BUSINESS_TIME (SQLSTATE 42711). Une table ne peut avoir qu'une seule période BUSINESS_TIME (SQLSTATE 42711). begin-column-name et end-column-name doivent être définis en tant que DATE ou TIMESTAMP (P) où P se trouve dans la plage 0 - 12 (SQLSTATE 42842), et que les colonnes doivent être définies comme NOT NULL (SQLSTATE 42831). begin-column-name et end-column-name ne doivent pas identifier une colonne définie avec une clause GENERATED (SQLSTATE 428HZ).
Une contrainte de vérification implicite est générée pour s'assurer que la valeur de end-column-name est supérieure à la valeur de begin-column-name. Le nom de la contrainte de vérification créée implicitement est DB2_GENERATED_CHECK_CONSTRAINT_FOR_BUSINESS_TIME et ne doit pas être le nom d'une autre contrainte de vérification spécifiée dans l'instruction (SQLSTATE 42710).
unique-constraint- Définit une contrainte de clé primaire ou unique. Si la table a une clé de distribution, une clé unique ou une clé primaire doit être un sur-ensemble de la clé de distribution. Une contrainte de clé primaire ou unique ne peut pas être spécifiée pour une table qui est une sous-table (SQLSTATE 429B3). Les clés primaires ou uniques ne peuvent pas être des sous-ensembles de dimensions (SQLSTATE 429BE). Si la table est une table racine, la contrainte s'applique à la table et à toutes ses sous-tables.
- CONSTRAINT constraint-name
- Nomme la clé primaire ou la contrainte unique.
- UNIQUE (column-name, ...
- Définit une clé unique composée des colonnes identifiées. Les colonnes identifiées doivent être définies comme NOT NULL. Chaque column-name doit identifier une colonne de la table et la même colonne ne doit pas être identifiée plusieurs fois.Si la table a une période BUSINESS_TIME définie, BUSINESS_TIME WITHOUT OVERLAPS peut être spécifié comme dernier élément de la liste d'expressions de clé. Si BUSINESS_TIME WITHOUT OVERLAPS est spécifié, la liste doit inclure au moins un nom de colonne. WITHOUT OVERLAPS signifie que pour les autres clés spécifiées, les valeurs sont uniques par rapport à l'heure pour la période BUSINESS_TIME. Lorsque BUSINESS_TIME WITHOUT OVERLAPS est spécifié, les colonnes de la période BUSINESS_TIME ne doivent pas être spécifiées comme faisant partie de la contrainte (SQLSTATE 428HW). La spécification de BUSINESS_TIME WITHOUT OVERLAPS ajoute les attributs suivants à la contrainte :
- Colonne de fin de la période BUSINESS_TIME dans l'ordre croissant
- Colonne de début de la période BUSINESS_TIME dans l'ordre croissant
Le nombre de colonnes identifiées ne doit pas dépasser 64, et la somme de leurs longueurs stockées ne doit pas dépasser la limite de longueur de clé d'index pour la taille de page. Pour les longueurs stockées dans les colonnes, voir Nombre d'octets. Pour connaître les limites de longueur de clé, voir
Limites SQL
. Aucun type distinct LOB, XML, basé sur l'un de ces types, ou type structuré, ne peut être utilisé comme élément d'une clé unique, même si l'attribut de longueur de la colonne est suffisamment petit pour correspondre à la limite de longueur de la clé d'index pour la taille de page (SQLSTATE 54008).L'ensemble de colonnes de la clé unique ne peut pas être identique à l'ensemble de colonnes de la clé primaire ou d'une autre clé unique (SQLSTATE 01543). (Si LANGLEVEL est SQL92E ou MIA, une erreur est renvoyée, SQLSTATE 42891).
Une contrainte unique ne peut pas être spécifiée si la table est une sous-table (SQLSTATE 429B3), car des contraintes uniques sont héritées de la supertable.
La description de la table enregistrée dans le catalogue inclut la clé unique et, si elle est appliquée, son index unique. Si elle est appliquée, un index bidirectionnel unique, qui permet des analyses avancées et inverses, est automatiquement créé pour les colonnes de la séquence qui sont spécifiées avec l'ordre croissant pour chaque colonne. Le nom de l'index est identique au nom de contrainte s'il n'est pas en conflit avec un index existant dans le schéma où la table est créée. Si le nom d'index est en conflit, le nom est SQL, suivi d'un horodatage (aammjjhhmmssxxx), avec SYSIBM comme nom de schéma.
- PRIMARY KEY (column-name,...)
- Définit une clé primaire composée des colonnes identifiées. La clause ne doit pas être spécifiée plusieurs fois, et les colonnes identifiées doivent être définies comme NOT NULL. Chaque nom de colonne doit identifier une colonne de la table et la même colonne ne doit pas être identifiée plusieurs fois.Si la table a une période BUSINESS_TIME définie, BUSINESS_TIME WITHOUT OVERLAPS peut être spécifié comme dernier élément de la liste d'expressions de clé. Si BUSINESS_TIME WITHOUT OVERLAPS est spécifié, la liste doit inclure au moins un nom de colonne. WITHOUT OVERLAPS signifie que pour le reste des clés spécifiées, les valeurs sont uniques par rapport à l'heure de la période BUSINESS_TIME. Lorsque BUSINESS_TIME WITHOUT OVERLAPS est spécifié, les colonnes de la période BUSINESS_TIME ne doivent pas être spécifiées comme faisant partie de la contrainte (SQLSTATE 428HW). La spécification de BUSINESS_TIME WITHOUT OVERLAPS ajoute les attributs suivants à la contrainte :
- Colonne de fin de la période BUSINESS_TIME dans l'ordre croissant
- Colonne de début de la période BUSINESS_TIME dans l'ordre croissant
Le nombre de colonnes identifiées ne doit pas dépasser 64 et la somme de leurs longueurs stockées ne doit pas dépasser la limite de longueur de la clé d'index pour la taille de page. Pour les longueurs stockées dans les colonnes, voir Nombre d'octets. Pour connaître les limites de longueur de clé, voir
Limites SQL
. Aucun type distinct LOB, XML, basé sur un de ces types, ou un type structuré ne peut être utilisé comme élément d'une clé primaire, même si l'attribut de longueur de la colonne est suffisamment petit pour correspondre à la limite de longueur de la clé d'index pour la taille de page (SQLSTATE 54008).L'ensemble de colonnes de la clé primaire ne peut pas être identique à l'ensemble de colonnes d'une clé unique (SQLSTATE 01543). (Si LANGLEVEL est SQL92E ou MIA, une erreur est renvoyée, SQLSTATE 42891).
Une seule clé primaire peut être définie sur une table.
Une clé primaire ne peut pas être spécifiée si la table est une sous-table (SQLSTATE 429B3), car la clé primaire est héritée de la supertable.
La description de la table enregistrée dans le catalogue inclut la clé primaire et, si elle est appliquée, son index principal. Si elle est appliquée, un index bidirectionnel unique, qui permet des analyses avancées et inverses, est automatiquement créé pour les colonnes de la séquence spécifiée en ordre croissant pour chaque colonne. Le nom de l'index est identique au nom de contrainte s'il n'est pas en conflit avec un index existant dans le schéma où la table est créée. Si le nom d'index est en conflit, le nom est SQL, suivi d'un horodatage (aammjjhhmmssxxx), avec SYSIBM comme nom de schéma.
Lorsque vous définissez explicitement des clés de distribution à l'aide de la clause DISTRIBUTE BY HASH, les colonnes d'une contrainte unique doivent être un sur-ensemble des colonnes de clé de distribution ; l'ordre des colonnes n'est pas important. Lorsque les clés de distribution sont implicitement définies, elles sont sélectionnées en fonction de la définition de la contrainte unique. Une sélection implicite de clés de distribution se produit dans les cas suivants :- La clause DISTRIBUTE BY HASH et la table sont définies dans un groupe de partitions de base de données comportant plusieurs partitions.
- La clause DISTRIBUTE BY RANDOM est utilisée.
- referential-constraint
- Définit une contrainte référentielle.
- CONSTRAINT constraint-name
- Nomme la contrainte référentielle.
- FOREIGN KEY (column-name,...)
- Définit une contrainte référentielle avec le nom de contrainte spécifié.
Laissez T1 dénoter la table des objets de l'instruction. La clé externe de la contrainte référentielle est composée des colonnes identifiées. Chaque nom de la liste de noms de colonnes doit identifier une colonne de T1 et la même colonne ne doit pas être identifiée plusieurs fois.
Le nombre de colonnes identifiées ne doit pas dépasser 64 et la somme de leurs longueurs stockées ne doit pas dépasser la limite de longueur de la clé d'index pour la taille de page. Pour les longueurs stockées dans les colonnes, voir Nombre d'octets. Pour connaître les limites de longueur de clé, voir
Limites SQL
. Aucun objet LOB, XML, type distinct basé sur l'un de ces types, ou aucune colonne de type structuré ne peut être utilisé comme partie d'une clé externe (SQLSTATE 42962). Il doit exister le même nombre de colonnes de clé externe que dans la clé parente, et les types de données des colonnes correspondantes doivent être compatibles (SQLSTATE 42830). Les descriptions à deux colonnes sont compatibles s'ils ont des types de données compatibles (les deux colonnes sont numériques, chaînes de caractères, graphiques, date/heure ou ont le même type distinct). - references-clause
- Indique la table parent ou le pseudonyme parent et la clé parente pour la contrainte référentielle.
- RÉFÉRENCES nom-table-parent ou pseudonyme
- La table ou l'alias spécifié dans une clause REFERENCES doit identifier une table de base ou un pseudonyme qui est décrit dans le catalogue, mais ne doit pas identifier de table de catalogue.
Une contrainte référentielle est un doublon si sa clé externe, la clé parente et la table parente ou le pseudonyme parent sont identiques à la clé externe, la clé parente et la table parente ou le pseudonyme parent d'une contrainte référentielle précédemment spécifiée. Les contraintes référentielles en double sont ignorées, et un avertissement est renvoyé (SQLSTATE 01543).
Dans la discussion suivante, laissez T2 dénoter la table parent identifiée et laissez T1 indiquer la table en cours de création (ou modifiée). (T1 et T2 peuvent être la même table).
La clé externe spécifiée doit avoir le même nombre de colonnes que la clé parent de T2 et la description de la colonne N de la clé externe doit être comparable à la description de la colonne N de cette clé parente. Les colonnes de date et d'heure ne sont pas considérées comme étant comparables à des colonnes de chaîne pour l'application de cette règle.- (column-name,...)
- La clé parente d'une contrainte référentielle est composée des colonnes identifiées. Chaque nom de colonne doit être un nom non qualifié qui identifie une colonne de T2. La même colonne ne doit pas être identifiée plusieurs fois.
La liste des noms de colonne doit correspondre à l'ensemble de colonnes (dans n'importe quel ordre) de la clé primaire ou à une contrainte unique qui existe sous T2 (SQLSTATE 42890). Si aucune liste de noms de colonne n'est spécifiée, T2 doit avoir une clé primaire (SQLSTATE 42888). L'omission de la liste de noms de colonnes est une spécification implicite des colonnes de cette clé primaire dans la séquence spécifiée à l'origine.
La contrainte référentielle spécifiée par une clause FOREIGN KEY définit une relation dans laquelle T2 est le parent et T1 est la dépendance.
rule-clause - La clé parente d'une contrainte référentielle est composée des colonnes identifiées. Chaque nom de colonne doit être un nom non qualifié qui identifie une colonne de T2. La même colonne ne doit pas être identifiée plusieurs fois.
- Indique les actions à effectuer sur les tables dépendantes.
- ON DELETE
- Indique l'action à effectuer sur les tables dépendantes lorsqu'une ligne de la table parent est supprimée. Il existe a quatre actions possibles :
- NO ACTION (par défaut)
- RESTRICT
- CASCADE
- SET NULL
La règle de suppression s'applique lorsqu'une ligne de T2 est l'objet d'une opération DELETE ou de suppression propagée et que cette ligne comporte des éléments dépendants dans T1. Laissez p dénoter une telle ligne de T2.- Si RESTRICT ou NO ACTION est spécifié, une erreur se produit et aucune ligne n'est supprimée.
- Si CASCADE est spécifié, l'opération de suppression est propagée aux dépendants de p dans T1.
- Si SET NULL est spécifié, chaque colonne acceptant la valeur NULL de la clé externe de chaque élément dépendant de p dans T1 a la valeur null.
SET NULL ne doit pas être spécifié, sauf si une colonne de la clé externe autorise les valeurs NULL. L'omission de la clause est une spécification implicite de ON DELETE NO ACTION.
Si T1 est connecté pour la suppression à T2 via plusieurs chemins, la définition de deux règles SET NULL avec des définitions de clé externe qui se chevauchent n'est pas autorisée. Par exemple, T1 (i1, i2, i3). Règle 1 avec clé externe (i1, i2) et Règle 2 avec clé externe (i2, i3) n'est pas autorisé.
L'ordre de déclenchement des règles est :- RESTRICT
- SET NULL OR CASCADE
- NO ACTION
Si une ligne de T1 est affectée par deux règles différentes, une erreur se produit et aucune ligne n'est supprimée.
Une contrainte référentielle ne peut pas être définie si elle entraîne la suppression d'une table liée à elle-même par un cycle comportant deux tables ou plus, et si l'une des règles de suppression est RESTRICT ou SET NULL (SQLSTATE 42915).
Une contrainte référentielle qui entraînerait la suppression d'une table connectée à elle-même ou à une autre table par plusieurs chemins peut être définie, sauf dans les cas suivants (SQLSTATE 42915) :
- Une table ne doit pas être à la fois une table dépendante dans une relation CASCADE (zuot-référencement ou référencement d'une autre table) et une relation d'auto-référencement dans laquelle la règle de suppression est RESTRICT ou SET NULL.
- Une clé chevauche une autre clé lorsqu'au moins une colonne d'une clé est la même qu'une colonne de l'autre clé. Lorsqu'une table est connectée pour la suppression à une autre table via plusieurs relations avec des clés externes qui se chevauchent, ces relations doivent avoir la même règle de suppression et aucune des règles de suppression ne peut être SET NULL.
- Lorsqu'une table est connectée avec suppression à une autre table via plusieurs relations et qu'au moins une de ces relations est spécifiée avec une règle de suppression SET NULL, les définitions de clé externes de ces relations ne doivent pas contenir de clé de distribution ou de colonne de clé MDC.
- Lorsque deux tables sont connectées pour la suppression à la même table via des relations CASCADE, les deux tables ne doivent pas être connectées pour la suppression les unes aux autres si la règle de suppression de la dernière relation de chaque chemin de suppression est RESTRICT ou SET NULL.
Si une ligne de T1 est affectée par des règles de suppression différentes, le résultat est l'effet de toutes les actions spécifiées par ces règles. Les déclencheurs AFTER et les contraintes CHECK sur T1 voient également l'effet de toutes les actions. Un exemple de cette ligne est une ligne qui doit être définie comme null via un chemin de suppression connecté à une table ancêtre, et ciblée pour être supprimée par un second chemin de connecté pour la suppression à la même table ancêtre. Le résultat serait la suppression de la ligne. Les déclencheurs AFTER DELETE sur cette table descendante sont activés, mais pas les déclencheurs AFTER UPDATE.
Lors de l'application des règles précédemment mentionnées à des contraintes référentielles, dans lesquelles la table parent ou la table dépendante est membre d'une hiérarchie de table basée sur un type structuré, toutes les contraintes référentielles qui s'appliquent à n'importe quelle table dans les hiérarchies respectives sont prises en compte.
- ON UPDATE
- Indique l'action à effectuer sur les tables dépendantes lorsqu'une ligne de la table parent est mise à jour. La clause est facultative. ON UPDATE NO ACTION est la valeur par défaut et ON UPDATE RESTRICT est la seule alternative.
La différence entre NO ACTION et RESTRICT est décrite dans la section
Remarques
.
check-constraint - Définit une contrainte de vérification. Une contrainte de vérification est une condition de recherche dont l'évaluation doit être différent de false ou une dépendance fonctionnelle définie entre les colonnes.
- CONSTRAINT constraint-name
- Désigne la contrainte de vérification.
- CHECK (check-condition)
- Définit une contrainte de vérification. La condition de recherche doit être true ou unknown pour chaque ligne de la table.
- search-condition
- Les restrictions suivantes sont imposées à la condition de recherche :
- Une référence à une colonne doit correspondre à une colonne de la table en cours de création.
- La condition de recherche ne peut pas contenir de prédicat TYPE.
- La condition de recherche ne peut contenir aucun des éléments suivants (SQLSTATE 42621) :
- Sous-requête
- Expressions XMLQUERY ou XMLEXISTS
- Opérations de déréférencement ou fonctions DEREF où l'argument de la référence à portée est autre que la colonne de l'identificateur d'objet (OID)
- Spécifications CAST avec une clause SCOPE
- Fonctions de colonne
- Fonctions qui ne sont pas déterministes
- Fonctions définies pour avoir une action externe
- Fonctions définies par l'utilisateur définies avec les instructions SQL MODIFIES ou READS SQL
- Variables hôte
- Marqueurs de paramètre
- sequence-references
- Spécifications OLAP
- Registres spéciaux et fonctions intégrées qui dépendent de la valeur d'un registre spécial
- Variables globales
- Références à des colonnes générées autres que la colonne d'identité
- Références à des colonnes de type XML (sauf dans un prédicat VALIDATED)
- Expression de table imbriquées à tolérance aux erreurs
functional-dependency - Définit une dépendance fonctionnelle entre les colonnes.
- column-name DETERMINED BY column-name or (column-name,...) DETERMINED BY (column-name,...)
- L'ensemble de colonnes parent contient les colonnes identifiées qui précèdent immédiatement la clause DETERMINED BY. L'ensemble de colonnes enfant contient les colonnes identifiées qui suivent immédiatement la clause DETERMINED BY. Toutes les restrictions de condition de recherche s'appliquent aux colonnes de l'ensemble parent et de l'ensemble enfant, et seules les références de colonne simples sont autorisées dans l'ensemble de colonnes (SQLSTATE 42621). La même colonne ne doit pas être identifiée plusieurs fois dans la dépendance fonctionnelle (SQLSTATE 42709). Le type de données de la colonne ne doit pas être un type de données LOB, un type distinct basé sur un type de données LOB, un type de données XML, ou un type structuré (SQLSTATE 42962). Une colonne TIMESTAMP ROW CHANGE ne peut pas être utilisée comme élément d'une clé primaire (SQLSTATE 429BV). Aucune colonne de l'ensemble enfant de colonnes ne peut être une colonne acceptant les valeurs NULL (SQLSTATE 42621).
Si une contrainte de vérification est spécifiée comme partie d'une définition de colonne, une référence de colonne ne peut être faite qu'à la même colonne. Les contraintes de vérification qui sont spécifiées dans une définition de table peuvent avoir des références de colonne identifiant les colonnes précédemment définies dans l'instruction CREATE TABLE. Les contraintes de vérification ne sont pas vérifiées au niveau des incohérences, des conditions de duplication ou d'équivalence. Par conséquent, des contraintes de vérification contradictoires ou redondantes peuvent être définies, ce qui entraîne d'éventuelles erreurs lors de l'exécution.
La condition de recherche
IS NOT NULL
peut être spécifié ; cependant, il est recommandé que la valeur NULL soit appliquée directement, à l'aide de l'attribut NOT NULL d'une colonne. Par exemple,CHECK (salary + bonus > 30000)est accepté si le salaire est défini sur NULL, car les contraintes CHECK doivent être satisfaites ou inconnues, et dans ce cas, le salaire est inconnu. Toutefois,CHECK (salary IS NOT NULL)serait considéré comme false et une violation de la contrainte si le salaire est défini sur NULL.Les contraintes de vérification avec condition de recherche sont appliquées lorsque des lignes de la table sont insérées ou mises à jour. Une contrainte de vérification définie sur une table s'applique automatiquement à toutes les sous-tables de cette table.
Une dépendance fonctionnelle n'est pas appliquée par le gestionnaire de base de données lors d'opérations normales, telles que l'insertion, la mise à jour, la suppression ou l'intégrité de l'ensemble. La dépendance fonctionnelle peut être utilisée lors de la réécriture de requête pour optimiser les requêtes. Des résultats incorrects peuvent être renvoyés si l'intégrité d'une dépendance fonctionnelle n'est pas maintenue.
- Les restrictions suivantes sont imposées à la condition de recherche :
constraint-attributes - Définit les attributs associés à des contraintes de clé primaire, d'intégrité référentielle unique ou de vérification.
- ENFORCED ou NON ENFORCED
- Indique si la contrainte est appliquée par le gestionnaire de base de données lors d'opérations normales telles que l'insertion, la mise à jour ou la suppression. La valeur par défaut est déterminée par le paramètre de configuration ddl_constraint_def. Vous pouvez remplacer le comportement par défaut en spécifiant ENFORCED ou NOT ENFORCED explicitement.
- ENFORCED
- La contrainte est appliquée par le gestionnaire de base de données. ENFORCED ne peut pas être spécifié dans les situations suivantes :
- Pour une dépendance fonctionnelle (SQLSTATE 42621)
- Lorsqu'une contrainte référentielle fait référence à un pseudonyme (SQLSTATE 428G7)
- NOT ENFORCED
- La contrainte n'est pas appliquée par le gestionnaire de base de données. Une contrainte de clé primaire ou une contrainte unique ne peut pas être NON ENFORCED si une contrainte référentielle ENFORCED dépendante existe.
- TRUSTED
- Les données peuvent être sécurisées pour être conformes à la contrainte. TRUSTED doit être utilisé uniquement si les données de la table sont reconnues indépendamment pour se conformer à la contrainte. Les résultats de la requête peuvent être imprévisibles si les données ne sont pas conformes à la contrainte. Il s'agit de l'option par défaut.
- NOT TRUSTED
- Les données ne peuvent pas être sécurisées pour être conformes à la contrainte. NOT TRUSTED est destiné aux cas où les données sont conformes à la contrainte pour la plupart des lignes, sans savoir de manière indépendante si toutes les lignes ou les ajouts futurs seront conformes à la contrainte. Si une contrainte n'est PAS TRUSTED et activée pour l'optimisation des requêtes, elle ne sera pas utilisée pour effectuer des optimisations qui dépendent des données entièrement conformes à la contrainte. NOT TRUSTED peut être indiqué uniquement pour les contraintes d'intégrité référentielle (SQLSTATE 42613).
- ENABLE QUERY OPTIMIZATION ou DISABLE QUERY OPTIMIZATION
- Indique si la contrainte ou la dépendance fonctionnelle peut être utilisée pour l'optimisation des requêtes dans des circonstances appropriées. La valeur par défaut est ENABLE QUERY OPTIMIZATION.
- ENABLE QUERY OPTIMIZATION
- La contrainte est supposée être vraie et peut être utilisée pour l'optimisation des requêtes.
- DISABLE QUERY OPTIMIZATION
- La contrainte ne peut pas être utilisée pour l'optimisation des requêtes. DISABLE QUERY OPTIMIZATION ne peut pas être spécifiée pour la clé primaire et les contraintes uniques (SQLSTATE 42613).
- OF type-name1
- Indique que les colonnes de la table sont basées sur les attributs du type structuré identifié par type-name1. Si type-name2 est spécifié sans nom de schéma, le nom du type est résolu en recherchant les schémas sur le chemin SQL (défini par l'option de prétraitement FUNCPATH pour SQL statique et par le registre CURRENT PATH pour SQL dynamique). Le nom de type doit être le nom d'un type défini par l'utilisateur (SQLSTATE 42704) et doit être un type structuré instanciable (SQLSTATE 428DP) avec au moins un attribut (SQLSTATE 42997).
Si le paramètre UNDER n'est pas spécifié, une colonne d'identificateur d'objet doit être spécifiée (voir la définition de colonne OID). Cette colonne d'identificateur d'objet est la première colonne de la table. La colonne d'ID objet est suivie de colonnes basées sur les attributs de type-name1.
- HIERARCHY hierarchy-name
- Nomme la table de hiérarchie associée à la hiérarchie de tables. Elle est créé en même temps que la table racine de la hiérarchie. Les données de toutes les sous-tables de la hiérarchie de tables basée sur un type structuré sont stockées dans cette dernière. Une table de hiérarchie ne peut pas être référencée directement dans les instructions SQL. Un nom de hiérarchie est un nom de table. Le nom de hiérarchie, y compris le nom de schéma implicite ou explicite, ne doit pas identifier de table, d'alias, de vue ou d'alias décrit dans le catalogue. Si le nom de schéma est spécifié, il doit être identique au nom de schéma de la table en cours de création (SQLSTATE 428DQ). Si cette clause est omise lors de la définition de la table racine, un nom est généré par le système. Ce nom se compose du nom de la table en cours de création, suivie d'un suffixe unique, de sorte que l'identificateur est unique parmi les identificateurs des tables, vues et pseudonymes existants.
- UNDER supertable-name
- Indique que la table est une sous-table du nom de supertable. La supertable doit être une table existante (SQLSTATE 42704) et la table doit être définie à l'aide d'un type structuré qui est le supertype immédiat de type-name1 (SQLSTATE 428DB). Le nom de schéma de nom de table et le nom de supertable doit être le même (SQLSTATE 428DQ). La table identifiée par le nom de supertable ne doit pas avoir de sous-table existante déjà définie qui utilise type-name1 (SQLSTATE 42742).
Les colonnes de la table incluent la colonne d'identificateur d'objet de la supertable dont le type est modifié pour être REF (type-name1), suivi de colonnes basées sur les attributs de type-name1 (rappelez-vous que le type inclut les attributs de son supertype). Les noms d'attribut ne peuvent pas être identiques au nom de la colonne OID (SQLSTATE 42711).
D'autres options de table, y compris les options d'espace table, de capture de données, de non connexion initiale et de clé de distribution ne peuvent pas être spécifiées. Ces options sont héritées de la supertable (SQLSTATE 42613).
- INHERIT SELECT PRIVILEGES
- Un utilisateur ou groupe détenant un privilège SELECT sur la supertable bénéficie d'un privilège équivalent sur la sous-table nouvellement créée. La définition de sous-table est considérée comme étant le constituant de ce privilège. typed-element-list
- Définit les éléments supplémentaires d'une table basée sur un type structuré. Cela inclut les options supplémentaires pour les colonnes, l'ajout d'une colonne d'identificateur d'objet (table racine uniquement) et les contraintes sur la table.
- OID-column-definition
- Définit la colonne d'identificateur d'objet pour la table basée sur un type structuré.
- REF IS OID-column-name USER GENERATED
- Indique qu'une colonne d'ID objet (OID) est définie dans la table en tant que première colonne. Un OID est requis pour la table racine d'une hiérarchie de tables (SQLSTATE 428DX). La table doit être une table basée sur un type structuré+ (la clause OF doit être présente) qui n'est pas une sous-table (SQLSTATE 42613). Le nom de la colonne est défini en tant qu'ID de colonne de nom et ne peut pas être identique au nom d'un attribut du type structuré type-name1 (SQLSTATE 42711). La colonne est définie avec le type REF (type-name1), NOT NULL et un index unique requis par le système (avec un nom d'index par défaut) est généré. Cette colonne s'appelle la colonne d'identificateur d'objet ou colonne OID. Les mots clés USER GENERATED indiquent que la valeur initiale de la colonne OID doit être fournie par l'utilisateur lors de l'insertion d'une ligne. Une fois qu'une ligne est insérée, la colonne OID ne peut pas être mise à jour (SQLSTATE 42808).
with-options - Définit les options supplémentaires qui s'appliquent aux colonnes d'une table basée sur un type structuré.
- nom-colonne
- Indique le nom de la colonne pour laquelle des options supplémentaires sont spécifiées. Le nom de colonne doit correspondre au nom d'une colonne de la table qui n'est pas également une colonne d'une supertable (SQLSTATE 428DJ). Un nom de colonne ne peut apparaître que dans une clause WITH OPTIONS de l'instruction (SQLSTATE 42613).
Si une option est déjà spécifiée dans la définition de type (dans CREATE TYPE), les options spécifiées ici remplacent les options dans CREATE TYPE.
- WITH OPTIONS column-options
- Définit les options de la colonne spécifiée. Voir column-options décrit précédemment. Si la table est une sous-table, une clé primaire ou des contraintes uniques ne peuvent pas être spécifiées (SQLSTATE 429B3).
- Indique le nom de la colonne pour laquelle des options supplémentaires sont spécifiées. Le nom de colonne doit correspondre au nom d'une colonne de la table qui n'est pas également une colonne d'une supertable (SQLSTATE 428DJ). Un nom de colonne ne peut apparaître que dans une clause WITH OPTIONS de l'instruction (SQLSTATE 42613).
- Définit la colonne d'identificateur d'objet pour la table basée sur un type structuré.
- LIKE table-name1, view-name ou nickname
- Indique que les colonnes de la table ont le même nom et la même description que les colonnes de la table spécifiée (table-name1), de la vue (name-view) ou de l'alias (nickname). La table, la vue ou le pseudonyme spécifié doit exister dans le catalogue ou être une table temporaire déclarée. Une table ou une vue basée sur un type structuré ne peut pas être spécifiée (SQLSTATE 428EC).L'utilisation de LIKE est une définition implicite des colonnes N, où N est le nombre de colonnes dans la table (y compris les colonnes masquées implicitement), la vue ou le pseudonyme de la table identifiée. Une colonne de la nouvelle table qui correspond à une colonne implicitement masquée dans la table existante sera également définie comme masquée implicitement. La définition implicite dépend de ce qui est spécifié après LIKE:
- Si une table est spécifiée, la définition implicite inclut le nom de la colonne, le type de données, l'attribut masqué et la caractéristique de valeur NULL de chacune des colonnes de cette table. Si la valeur EXCLUDING COLUMN DEFAULTS n'est pas spécifiée, la valeur par défaut de la colonne est également incluse.
- Si une vue est spécifiée, la définition implicite inclut le nom de colonne, le type de données et la caractéristique de valeur NULL de chacune des colonnes de résultat de l'instruction FULLSELECT définie dans cette vue. Les types de données des colonnes de vue doivent être des types de données valides pour les colonnes d'une table.
- Si un pseudonyme est spécifié, la définition implicite inclut le nom de colonne, le type de données et la caractéristique de valeur NULL de chaque colonne de ce pseudonyme.
- Si une table protégée est spécifiée, la nouvelle table hérite des mêmes règles de sécurité et colonnes protégées que la table identifiée.
- Si une table est spécifiée et si cette table contient une colonne de début de ligne, une colonne de fin de ligne ou une colonne ID-début de transaction, la colonne correspondante de la nouvelle table hérite uniquement du type de données de la colonne source. La nouvelle colonne n'est pas considérée comme une colonne générée.
- Si une table incluant une période est spécifiée, la nouvelle table n'hérite pas de la définition de période.
- Si une table temporelle de période système est spécifiée, la nouvelle table n'est pas une table temporelle de période système.
- Si une table de distribution aléatoire qui utilise la méthode génération aléatoire est spécifiée, et si la nouvelle table en cours de création ne partage pas la même distribution de table, la colonne RANDOM_DISTRIBUTION_KEY utilisée pour générer les valeurs de distribution aléatoires n'est pas incluse.
Les attributs de colonne par défaut et de colonne d'identité peuvent être inclus ou exclus en fonction des clauses relatives aux attributs de copie. La définition implicite n'inclut aucun autre attribut de la table, de la vue ou du pseudonyme identifié. Par conséquent, la nouvelle table ne possède pas de clé primaire, de contraintes uniques, de contraintes de clé externe, de contraintes d'intégrité référentielle, de déclencheurs, d'index, de spécifications ORGANIZE ou de spécification PARTITIONING KEY. La table est créée dans l'espace table implicitement ou explicitement spécifiée par la clause IN, et la table n'a d'autre clause facultative que si la clause facultative est spécifiée.
Lorsqu'une table est identifiée dans la clause LIKE et que cette table contient une colonne ROW CHANGE TIMESTAMP, la colonne correspondante de la nouvelle table hérite uniquement du type de données de la colonne ROW CHANGE TIMESTAMP. La nouvelle colonne n'est pas considérée comme une colonne générée.
Si une table est spécifiée et si le contrôle d'accès au niveau de ligne ou de colonne est activé pour cette table, il n'est pas hérité par la nouvelle table.
copy-options - Ces options indiquent si vous souhaitez copier des attributs supplémentaires de la définition de table de résultats source (table, vue ou FULLSELECT).
- INCLUDING COLUMN DEFAULTS
- Les valeurs par défaut des colonnes de chaque colonne actualisable de la définition de table de résultats source sont copiées. Les colonnes qui ne sont pas actualisables n'ont pas de valeur par défaut définie dans la colonne correspondante de la table créée.
Si LIKE table-name est spécifié et que le nom de table identifie une table de base, une table temporaire créée ou une table temporaire déclarée, INCLUDING COLUMN DEFAULTS est la valeur par défaut. Si LIKE table-name est spécifié et que le nom de table identifie un pseudonyme, INCLUDING COLUMN DEFAULTS n'a pas d'effet, et les valeurs par défaut de colonne ne sont pas copiées.
- EXCLUDING COLUMN DEFAULTS
- Les valeurs par défaut des colonnes ne sont pas copiées à partir de la définition de table de résultats source.
Cette clause est la valeur par défaut, sauf lorsque LIKE table-name est spécifié et que le nom de table identifie une table de base, une table temporaire créée ou une table temporaire déclarée.
- INCLUDING IDENTITY COLUMN ATTRIBUTES
- Les attributs de colonne d'identité sont copiés à partir de la définition de table de résultats source, si possible. Il est possible de copier les attributs de la colonne d'identité, si l'élément de la colonne correspondante dans la table, la vue ou fullselect est le nom d'une colonne de table ou le nom d'une colonne de vue qui correspond directement ou indirectement au nom d'une colonne de table de base avec la propriété d'identité. Dans tous les autres cas, les colonnes de la nouvelle table ne reçoivent pas la propriété d'identité. Exemple :
- La liste de sélection de l'instruction fullselect inclut plusieurs instances du nom d'une colonne d'identité (c'est-à-dire en sélectionnant la même colonne plusieurs fois).
- La liste de sélection de l'instruction fulllselect inclut plusieurs colonnes d'identité (c'est-à-dire qu'elle implique une jointure).
- La colonne d'identité est incluse dans une expression dans la liste de sélection
- L'instruction fullselect inclut une opération set (union, sauf, ou intersection).
- EXCLUDING IDENTITY COLUMN ATTRIBUTES
- Les attributs de colonne d'identité ne sont pas copiés à partir de la définition de table de résultats source.
as-result-table - nom-colonne
- Nomme les colonnes de la table. Si une liste de noms de colonne est spécifiée, elle doit contenir autant de noms qu'il existe de colonnes dans la table de résultats de fullselect. Chaque nom de colonne doit être unique et non qualifié. Si aucune liste de noms de colonne n'est spécifiée, les colonnes de la table héritent des noms des colonnes de la table de résultats de fullselect.
Une liste de noms de colonnes doit être spécifiée si la table de résultat du fullselect a des noms de colonnes dupliqués d'une colonne non nommée (SQLSTATE 42908). Une colonne sans nom est une colonne dérivée d'une constante, d'une fonction, d'une expression ou d'une opération définie qui n'est pas nommée à l'aide de la clause AS de la liste de sélection.
- AS (fullselect)
- Indique que, pour chaque colonne de la table de résultats dérivée de fullselect, une colonne correspondante doit être définie pour la table. Chaque colonne définie adopte les attributs suivants à partir de la colonne correspondante de la table de résultats (si applicable au type de données):
- Nom de colonne
- Description de colonne
- Type de données, longueur, précision et échelle
- Acceptabilité des valeurs indéfinies (NULL)
Les attributs suivants ne sont pas inclus (bien que la valeur par défaut et les attributs d'identité puissent être inclus à l'aide des options de copie) :- Valeur par défaut
- Attributs d'identité
- Attribut masqué
- ROW CHANGE TIMESTAMP
- Tous les autres attributs facultatifs des tables ou des vues référencées dans l'instruction fullselect
Les restrictions suivantes s'appliquent :- Chaque élément de liste de sélection doit avoir un nom unique (SQLSTATE 42711). La clause AS peut être utilisée dans la clause select pour fournir des noms uniques.
- fullselect ne peut pas faire référence à des variables hôte ou inclure des marqueurs de paramètre.
- Les types de données des colonnes de résultat de fullselect doivent être des types de données valides pour les colonnes d'une table.
- Si le contrôle d'accès au niveau de la ligne ou de la colonne (RCAC) est activé pour toute table spécifiée dans fullselect, RCAC n'est pas en cascade dans la nouvelle table.f
- fullselect ne peut pas inclure une clause data-change-table-reference (SQLSTATE 428FL).
- Une instruction fullselect valide qui ne fait pas référence à une table basée sur un type structuré ou à une vue basée sur un type structuré peut être spécifiée.
- WITH NO DATA | WITH DATA
- Détermine s'il faut remplir les colonnes de la table avec les données :
- WITH NO DATA
- N'exécutez pas fullselect. Utilisé uniquement pour définir la table qui n'est pas remplie avec les résultats de la requête.
- WITH DATA
- Exécutez fullselect et remplissez la table avec les résultats de la requête.
materialized-query-definition- Nomme les colonnes de la table. Si une liste de noms de colonne est spécifiée, elle doit contenir autant de noms qu'il existe de colonnes dans la table de résultats de fullselect. Chaque nom de colonne doit être unique et non qualifié. Si aucune liste de noms de colonne n'est spécifiée, les colonnes de la table héritent des noms des colonnes de la table de résultats de fullselect.
- nom-colonne
- Nomme les colonnes de la table. Si une liste de noms de colonnes est spécifiée, elle doit comporter autant de noms qu'il y a de colonnes dans le tableau de résultats de la sélection complète. Chaque nom de colonne doit être unique et non qualifié. Si aucune liste de noms de colonnes n'est spécifiée, les colonnes du tableau héritent des noms des colonnes du tableau de résultats de la sélection complète.
Une liste de noms de colonnes doit être spécifiée si la table de résultats de fullselect comporte des noms de colonne en double d'une colonne sans nom (SQLSTATE 42908). Une colonne sans nom est une colonne dérivée d'une constante, d'une fonction, d'une expression ou d'une opération définie qui n'est pas nommée à l'aide de la clause AS de la liste de sélection.
Si MAINTAINED BY REPLICATION est spécifié, les noms de colonne de la liste de colonnes doivent correspondre aux noms des colonnes de la table spécifiée dans fullselect.
- système autonome
- Introduit la requête utilisée pour la définition de la table et qui détermine les données à inclure dans la table. fullselect
- Définit la requête sur laquelle la table est basée. Les définitions de colonne résultables sont identiques à celles d'une vue définie avec la même requête. Une colonne de la nouvelle table qui correspond à une colonne implicitement masquée d'une table de base référencée dans l'instruction fullselect n'est pas considérée comme masquée dans la nouvelle table.
Chaque élément de liste de sélection doit avoir un nom (utilisez la clause AS pour les expressions). La définition de requête matérialisée définit les attributs de la table de requêtes matérialisée. L'option choisie définit également le contenu de la sélection complète comme suit :
L'instruction fullselect ne peut pas inclure de clause data-change-table-reference (SQLSTATE 428FL), la clause d'extraction ou la clause ORDER BY (SQLSTATE 428FJ).
Lorsque REFRESH DEFERRED ou REFRESH IMMEDIATE est spécifié, l'instruction fullselect ne peut pas inclure (SQLSTATE 428EC):- Références à une table de requête matérialisée, à une table temporaire créée, à une table temporaire déclarée ou à une table table basée sur un type structuré une clause FROM.
- Fait référence à une vue dans laquelle l'instruction fullselect de la vue est une violation de l'une des restrictions répertoriées dans l'instruction fullselect de la table de requêtes matérialisée
- Expressions qui sont un type de référence (ou un type distinct basé sur ce type)
- Fonctions ayant l'un des attributs suivants :
- EXTERNAL ACTION
- LANGUE SQL
- CONTAINS SQL
- READS SQL DATA
- MODIFIES SQL DATA
- NOT SECURED si les fonctions font référence à une table de requêtes matérialisée, qui fait référence à une table dont le contrôle d'accès de ligne ou de colonne est activé.
- Fonctions qui dépendent des caractéristiques physiques (par exemple, DBPARTITIONNUM, HASHEDVALUE, RID_BIT, RID)
- Une expression ROW CHANGE ou une référence à une colonne ROW CHANGE TIMESTAMP de la ligne
- Les références de table ou de vue aux objets système (les tables Explain ne doivent pas non plus être spécifiées)
- Expressions qui sont d'un type structuré, d'un type LOB (ou d'un type distinct basé sur un type LOB) ou de type XML
- Références à une table protégée ou à un pseudonyme protégé
Lorsque DISTRIBUTE BY REPLICATION est spécifié, les restrictions suivantes s'appliquent:- La clause GROUP BY n'est pas autorisée.
- La table de requêtes matérialisée ne doit faire référence qu'à une seule table ; c'est-à-dire qu'elle ne peut pas inclure une jointure.
Lorsque MAINTAINED BY REPLICATION est spécifié, les restrictions suivantes s'appliquent :- La requête doit être une sous-requête composée uniquement d'une clause SELECT et d'une clause FROM.
- La clause FROM doit faire référence à une table unique qui est organisée par ligne et qui n'est pas spécifiée dans une définition de table fantômee existante.
- La table référencée ne peut pas être une table partitionnée de plage, une table de classification multidimensionnelle, une table groupée par plage, une table temporelle ou une table contenant une colonne LONG VARCHAR ou LONG VARGRAPHIC.
- La table référencée ne peut pas être protégée par le contrôle d'accès aux lignes et aux colonnes (RCAC) ou LBAC (label-based access control).
- La liste de sélection peut inclure uniquement les références directes aux colonnes de la table dont les types de données sont pris en charge dans une table organisée en colonnes. Aucune expression ne peut être utilisée.
- Les colonnes spécifiées dans la liste de sélection ne peuvent pas être renommée à l'aide de la liste de noms de colonne ou de la clause AS dans la liste de sélection.
- La table référencée doit avoir au moins une contrainte de clé primaire forcée ou une contrainte unique, et les colonnes spécifiées dans la liste de sélection doivent inclure toutes les colonnes de clé à partir d'au moins une de ces contraintes.
Lorsque REFRESH IMMEDIATE est spécifié :- La requête doit être une sous-requête, sauf que UNION ALL est prise en charge dans l'expression de table d'entrée d'une clause GROUP BY.
- La requête ne peut pas être récursive.
- La requête ne peut pas inclure :
- Références à un pseudonyme
- Fonctions qui ne sont pas déterministes
- Instructions fullselect scalaires
- Prédicats avec instuctions fullselect
- Registres spéciaux et fonctions intégrées qui dépendent de la valeur d'un registre spécial
- Variables globales
- SELECT DISTINCT
- Expression de table imbriquées à tolérance aux erreurs
- Si la clause FROM fait référence à plusieurs tables ou vues, elle ne peut définir qu'une jointure interne sans utiliser la syntaxe INNER JOIN explicite.
- Lorsqu'une clause GROUP BY est spécifiée, les considérations suivantes s'appliquent :
- Les fonctions de colonne prises en charge sont SUM, COUNT, COUNT_BIG et GROUPING (sans DISTINCT). La liste de sélection doit contenir une colonne COUNT(*) ou COUNT_BIG(*). Si la liste de sélection de la table de requêtes matérialisée contient SUM(X), où X est un argument NULL, la table de requêtes matérialisée doit également avoir COUN (X) dans sa liste de sélection. Ces fonctions de colonne ne peuvent pas faire partie d'aucune expression.
- Une clause HAVING n'est pas autorisée.
- Si dans un groupe de partitions de base de données à partitions multiples, la clé de distribution doit être un sous-ensemble des éléments GROUP BY.
- La table de requêtes matérialisée ne doit pas contenir de lignes en double, et les restrictions suivantes spécifiques à cette exigence d'unicité s'appliquent, selon qu'une clause GROUP BY est spécifiée.
- Lorsqu'une clause GROUP BY est spécifiée, les restrictions d'unicité suivantes s'appliquent :
- Tous les éléments GROUP BY doivent être inclus dans la liste de sélection.
- Lorsque la clause GROUP BY contient des éléments GROUPING SETS, CUBE ou ROLLUP, les éléments GROUP BY et GROUPING associés dans la liste de sélection doivent former une clé unique de l'ensemble de résultats. Par conséquent, les restrictions suivantes doivent être respectées :
- Aucun ensemble de groupes ne peut être répété. Par exemple,
ROLLUP(X,Y),Xn'est pas autorisé, car il est équivalent àGROUPING SETS((X,Y),(X),(X)). - Si X est un élément de GROUP BY qui s'affiche dans GROUPING SETS, CUBE ou ROLLUP, GROUPING(X) doit apparaître dans la liste de sélection.
- Aucun ensemble de groupes ne peut être répété. Par exemple,
- Lorsqu'une clause GROUP BY n'est pas spécifiée, les restrictions d'unicité suivantes s'appliquent :
- L'exigence d'unicité de la table de requêtes matérialisée est obtenue en dérivant une clé unique pour la vue matérialisée à partir de l'une des contraintes de clé uniques définies dans chacune des tables sous-jacentes. Par conséquent, les tables sous-jacentes doivent avoir au moins une contrainte de clé unique qui est définie sur elles, et les colonnes de ces clés doivent apparaître dans la liste de sélection de la définition de table de requêtes matérialisée.
- Lorsqu'une clause GROUP BY est spécifiée, les restrictions d'unicité suivantes s'appliquent :
Lorsque REFRESH DEFERRED est spécifié :- Si la table de requêtes matérialisée est créée avec l'intention de la fournir avec une table de transfert associée dans une instruction ultérieure, l'instruction fullselect de la table de requêtes matérialisée doit suivre les mêmes restrictions et règles qu'une instruction fullselect utilisée pour créer une table de requêtes matérialisée avec l'option REFRESH IMMEDIATE.
- Si la requête est récursive, la table de requêtes matérialisée n'est pas utilisée pour optimiser le traitement des requêtes.
- La table de requêtes matérialisée n'est pas utilisée pour optimiser le traitement des requêtes statiques.
Une table de requêtes matérialisée dont l'instruction fullselect contient une clause GROUP BY récapitule les données des tables référencées dans l'instruction fullselect. Une table de requête matérialisée est également connue sous le nom de table récapitulative. Une table récapitulative est un type spécialisé de table de requêtes matérialisée.
Si fullselect fait référence à une table ou à une vue qui dépend d'une table pour laquelle le contrôle d'accès au niveau de ligne ou de colonne a été activé, ces contrôles d'accès de niveau ligne ou colonne sont ignorés lors du remplissage de la table de requêtes matérialisée. La table de requêtes matérialisée est automatiquement créée avec le contrôle d'accès au niveau de ligne activé. L'accès direct par les utilisateurs à cette table ne voit aucun contenu, sauf si des droits appropriés sont créés ou si un utilisateur avec les droits SECADM choisit de désactiver le contrôle d'accès au niveau de la ligne sur cette table de requête matérialisée. Le contrôle d'accès au niveau des lignes et des colonnes de la table de requêtes matérialisée n'affecte pas le routage interne par le compilateur SQL vers la table de requêtes matérialisée.
refreshable-table-options - Définissez les options d'actualisables des attributs de la table de requêtes matérialisée.
- DATA INITIALLY DEFERRED
- Les données ne sont pas insérées dans la table dans le cadre de l'instruction CREATE TABLE. Une instruction REFRESH TABLE indiquant le nom de table est utilisée pour insérer des données dans la table.
- REFRESH
- Indique comment les données de la table sont gérées.
- DEFERRED
- Les données de la table peuvent être actualisées à tout moment à l'aide de l'instruction REFRESH TABLE. Les données de la table ne reflètent que le résultat de la requête en tant qu'image instantanée au moment du traitement de l'instruction REFRESH TABLE. Les tables de requêtes matérialisées gérées par le système qui sont définies avec cet attribut ne permettent pas d'instructions INSERT, UPDATE ou DELETE (SQLSTATE 42807). Les tables de requêtes matérialisées gérées par l'utilisateur qui sont définies avec cet attribut permettent des instructions INSERT, UPDATE ou DELETE.
- IMMEDIATE
- Les modifications apportées aux tables sous-jacentes dans le cadre d'une commande DELETE, INSERT ou UPDATE sont mises en cascade dans la table de requêtes matérialisée. Dans ce cas, le contenu de la table, à n'importe quel moment, est le même que si le subselect spécifié est traité. Les tables de requêtes matérialisées (MQT) définies avec cet attribut ne permettent pas d'instructions INSERT, UPDATE ou DELETE (SQLSTATE 42807). Les MQT organisées en colonnes à l'aide de l'option REFRESH IMMEDIATE ne sont pas prises en charge lorsque la clause MAINTAINED BY SYSTEM est spécifiée (SQL20058N).
- ENABLE QUERY OPTIMIZATION
- La table de requêtes matérialisée peut être utilisée pour l'optimisation des requêtes dans certains cas.
- DISABLE QUERY OPTIMIZATION
- La table de requêtes matérialisée ne sera pas utilisée pour l'optimisation des requêtes. La table peut toujours être interrogée directement.
- MAINTAINED BY
- Indique si les données de la table de requêtes matérialisée sont gérées par le système, l'utilisateur ou l'outil de réplication. La valeur par défaut est SYSTEM.
- SYSTEME
- Indique que les données de la table de requêtes matérialisée sont gérées par le système. Une table de requêtes matérialisée gérée par le système qui est définie comme ORGANIZE BY COLUMN doit utiliser les options REFRESH DEFERRED et DISTRIBUTE BY REPLICATION.
- Utilisateur
- Indique que les données de la table de requêtes matérialisée sont gérées par l'utilisateur. L'utilisateur est autorisé à effectuer des opérations de mise à jour, de suppression ou d'insertion sur des tables de requêtes matérialisées gérées par l'utilisateur. L'instruction REFRESH TABLE, qui est utilisée pour les tables de requêtes matérialisées gérées par le système, ne peut pas être appelée sur des tables de requêtes matérialisées gérées par l'utilisateur. Seule une table de requête matérialisée REFRESH DEFERRED peut être définie comme MAINTAINED BY USER.
- REPLICATION
- Indique que les données de la table de requêtes matérialisée sont gérées par une technologie de réplication externe. MAINTAINED BY REPLICATION ne peut pas être spécifié dans un environnement de base de données partitionnée ou dans un environnement Db2 pureScale (SQLSTATE 56038). L'instruction REFRESH TABLE, qui est utilisée pour les tables de requêtes matérialisées gérées par le système, ne peut pas être exécutée sur des tables de requêtes matérialisées gérées par réplication, appelées tables fantômes. Seule une table de requêtes matérialisée REFRESH DEFERRED peut être définie comme MAINTAINED BY REPLICATION, et la définition doit inclure ORGANIZE BY COLUMN.
- FEDERATED_TOOL
- Indique que les données de la table de requêtes matérialisée sont gérées par un outil de réplication fédéré. L'instruction REFRESH TABLE, qui est utilisée pour les tables de requêtes matérialisées gérées par le système, ne peut pas être appelée sur des tables de requêtes matérialisées gérées par l'outil fédéré. Seule une table de requêtes matérialisée REFRESH DEFERRED peut être définie comme MAINTAINED BY FEDERATED_TOOL.
Lorsque vous spécifiez cette option, la clause select de l'instruction CREATE TABLE ne peut pas contenir de référence à une table de base (SQLSTATE 428EC).
staging-table-definition- Nomme les colonnes de la table. Si une liste de noms de colonnes est spécifiée, elle doit comporter autant de noms qu'il y a de colonnes dans le tableau de résultats de la sélection complète. Chaque nom de colonne doit être unique et non qualifié. Si aucune liste de noms de colonnes n'est spécifiée, les colonnes du tableau héritent des noms des colonnes du tableau de résultats de la sélection complète.
- Définit la requête prise en charge par la table de transfert indirectement via une table de requêtes matérialisée associée. Les tables sous-jacentes de la table de requêtes matérialisée sont également les tables sous-jacentes de la table de transfert associée. La table de transfert collecte les modifications qui doivent être appliquées à la table de requêtes matérialisée pour le synchroniser avec le contenu des tables sous-jacentes.
Si fullselect fait référence à une table ou à une vue qui dépend d'une table pour laquelle le contrôle d'accès au niveau de ligne ou de colonne a été activé, les contrôles d'accès au niveau des lignes ou des colonnes sont ignorés lors du remplissage de la table de transfert. Toutefois, la table de transfert est automatiquement créée avec le contrôle d'accès au niveau de ligne activé. L'accès direct par les utilisateurs à cette table de transfert ne voit aucun contenu, sauf si des droits appropriés sont créés ou si un utilisateur avec les droits SECADM choisit de désactiver le contrôle d'accès au niveau de la ligne sur cette table de transfert. Le contrôle d'accès au niveau des lignes et des colonnes de la table de transfert n'affecte pas le processus interne d'application des modifications capturées par la table de transfert à la table de requêtes matérialisée associée.
- staging-column-name
- Nomme les colonnes de la table de transfert. Si une liste de noms de colonnes est spécifiée, elle doit comporter deux noms de plus que les colonnes existantes dans la table de requête matérialisée pour laquelle la table de mise à disposition est définie. Si la table de requêtes matérialisée est une table de requêtes matérialisée répliquée, ou si la requête définissant la table de requêtes matérialisée ne contient pas de clause GROUP BY, la liste des noms de colonne doit être composée de trois noms de plus qu'il n'y a de colonnes dans la table de requêtes matérialisée pour laquelle la table de transfert est définie. Chaque nom de colonne doit être unique et non qualifié. Si aucune liste de noms de colonne n'est spécifiée, les colonnes de la table héritent des noms des colonnes de la table de requêtes matérialisée associée. Les colonnes supplémentaires sont nommées GLOBALTRANSID et GLOBALTRANSTIME, et si une troisième colonne est nécessaire, elle s'appelle OPERATIONTYPE.
Tableau 2. Colonnes supplémentaires en annexe dans les tables de transfert Nom de colonne Type de données Description de la colonne GLOBALTRANSID CHAR(8) FOR BIT DATA ID transaction globale pour chaque ligne propagée GLOBALTRANSTIME CHAR(13) FOR BIT DATA Horodatage de la transaction OPERATIONTYPE INTEGER Opération pour la ligne propagée, insertion, mise à jour ou suppression. Une liste de noms de colonnes doit être spécifiée si l'une des colonnes de la table de requêtes matérialisée associée dupliqua l'un des noms de colonne générés (SQLSTATE 42711).
- FOR table-name2
- Indique la table de requêtes matérialisée utilisée pour la définition de la table de transfert. Le nom, y compris le schéma implicite ou explicite, doit identifier une table de requêtes matérialisée qui existe sur le serveur en cours défini avec REFRESH DEFERRED. L'instruction fullselect de la table de requêtes matérialisée associée doit suivre les mêmes restrictions et règles qu'une instruction fullselect utilisée pour créer une table de requêtes matérialisée avec l'option REFRESH IMMEDIATE.
Le contenu de la table de transfert peut être utilisé pour actualiser la table de requêtes matérialisée, en appelant l'instruction REFRESH TABLE, si le contenu de la table de transfert est cohérent avec la table de requêtes matérialisée associée et les tables source sous-jacentes.
- PROPAGATE IMMEDIATE
- Les modifications apportées aux tables sous-jacentes dans le cadre d'une opération de suppression, d'insertion ou de mise à jour sont mises en cascade dans la table de transfert dans la même opération de suppression, d'insertion ou de mise à jour. Si la table de transfert n'est pas marquée incohérente, son contenu, à n'importe quel point de cohérence, est la modification delta de la table sous-jacente depuis la dernière table de requêtes matérialisée.
- Nomme les colonnes de la table de transfert. Si une liste de noms de colonnes est spécifiée, elle doit comporter deux noms de plus que les colonnes existantes dans la table de requête matérialisée pour laquelle la table de mise à disposition est définie. Si la table de requêtes matérialisée est une table de requêtes matérialisée répliquée, ou si la requête définissant la table de requêtes matérialisée ne contient pas de clause GROUP BY, la liste des noms de colonne doit être composée de trois noms de plus qu'il n'y a de colonnes dans la table de requêtes matérialisée pour laquelle la table de transfert est définie. Chaque nom de colonne doit être unique et non qualifié. Si aucune liste de noms de colonne n'est spécifiée, les colonnes de la table héritent des noms des colonnes de la table de requêtes matérialisée associée. Les colonnes supplémentaires sont nommées GLOBALTRANSID et GLOBALTRANSTIME, et si une troisième colonne est nécessaire, elle s'appelle OPERATIONTYPE.
- ORGANIZE BY
- Indique comment les données sont organisées dans les pages de données de la table.Les restrictions suivantes s'appliquent à une table de requêtes matérialisée :
- Les tables de requêtes matérialisée autres que les tables de réplication doivent faire référence à des tables avec la même organisation que la table de requêtes matérialisée.
- La clause ORGANIZE BY COLUMN doit être spécifiée lors de la création d'une table MQT, même si le paramètre de configuration de base de données dft_table_org a la valeur COLUMNorganisée par colonnes.
- Pour une table de requêtes matérialisée par colonnes, les types de table suivants peuvent être utilisés :
- Tables ombrées
- MQT gérées par l'utilisateur
- Les MQT gérées par le système qui sont définies avec les clauses
REFRESH DEFERREDetDISTRIBUTE BY REPLICATION.
L'organisation par défaut est déterminée par la valeur du paramètre de configuration de base de données dft_table_org.
- LIGNE
- Les données sont stockées par ligne dans les pages de données de la table. Une page de données donnée stocke les données pour une ou plusieurs lignes de la table.
- Colonne
- Les données sont stockées par colonne dans les pages de données de la table. Chaque page de données stocke les données d'une colonne de la table.
- ROW USING
- Les données sont stockées par ligne dans les pages de données de la table et sont également organisées à l'aide d'une clause de dimensions, d'une séquence de touches ou d'une heure d'insertion. Si vous spécifiez une clause de dimensions, une séquence de clés ou une heure d'insertion, la spécification de l'option ROW USING est facultative, sauf si l'organisation de table par défaut pour la base de données est COLUMN, auquel cas la spécification de ROW USING est obligatoire.
- DIMENSIONS (column-name,...)
- Indique une dimension pour chaque colonne ou groupe de colonnes utilisé pour regrouper les données de la table. Une table dont la définition indique cette clause est appelée table de regroupement multidimensionnel (MDC). Utilisez des parenthèses dans la liste des dimensions pour indiquer qu'un groupe de colonnes doit être traité comme une seule dimension. Le mot clé DIMENSIONS est facultatif.
Un index de bloc de classification est automatiquement conservé pour chaque dimension spécifiée, et un index de bloc, composé de toutes les colonnes utilisées dans la clause, est conservé si aucun des index de bloc de classification ne les inclut tous. L'ensemble de colonnes utilisé dans la clause ORGANIZE BY doit respecter les règles de l'instruction CREATE INDEX qui spécifie CLUSTER.
Chaque nom de colonne spécifié dans la clause ORGANIZE BY doit être défini pour la table (SQLSTATE 42703). Une dimension ne peut pas se produire plusieurs fois dans la liste de dimensions (SQLSTATE 42709). Les dimensions ne peuvent pas contenir une colonne ROW CHANGE TIMESTAMP, une colonne de début de ligne, une colonne de fin de ligne, une colonne d'ID de début de transaction (SQLSTATE 429BV), ou une colonne XML (SQLSTATE 42962). Si la table utilise la taille de ligne étendue, chaque colonne de dimension avec un type de données VARCHAR ou VARGRAPHIC ne peut pas avoir un attribut de longueur supérieur à 24 octets (SQLSTATE 54010).
Les pages de la table sont disposées en blocs de taille égale, c'est-à-dire la taille de l'étendue de l'espace table, et toutes les lignes de chaque bloc contiennent la même combinaison de valeurs de dimension.
Une table peut être à la fois une table de mise en cluster multidimensionnelle (MDC) et une table partitionnée. Les colonnes d'une telle table peuvent être utilisées à la fois dans la spécification de partition de plage et dans la clé MDC. Le partitionnement de table est multi-colonne et non multidimensionnel.
Pour une table MDC partitionnée créée par Db2 Version 9.7 Fix Pack 1 ou version ultérieure, les index de bloc sont partitionnés. Le placement d'index de blocs partitionnés suit la règle générale de placement de mémoire de l'index partitionné. Toutes les partitions d'index d'une partition de données, y compris les index de blocs MDC, partagent un seul objet d'index. Par défaut, les partitions d'index de chaque partition de données spécifique se trouvent dans le même espace table que la partition de données. Cette option peut être remplacée par la clause INDEX IN de niveau partition.
Pour les tables MDC qui ont été créées à l'aide de Db2 V9.7 ou antérieure, les index de bloc sont non partitionnés et restent non partitionnés s'ils sont régénérés. Les tables MDC avec index de blocs partitionnés peuvent coexister dans la même base de données que les tables MDC avec des index de blocs non partitionnés. Pour modifier les index de blocs non partitionnés en index de blocs partitionnés, utilisez un déplacement de table en ligne pour migrer la table MDC.
- KEY SEQUENCE sequence-key-spec
- Indique que la table est organisée en ordre croissant avec une taille fixe basée sur la plage spécifiée de valeurs de séquence de clés. Une table organisée de cette manière est appelée table groupée par plage. Chaque valeur de clé possible dans la plage définie a un emplacement prédéterminé dans la table physique. La mémoire requise pour une table groupée par plage doit être disponible lorsque la table est créée et doit être suffisante pour contenir le nombre de lignes dans la plage spécifiée multipliée par la taille de ligne (pour plus de détails sur la détermination de l'espace requis, voir Limite de taille de ligne et Nombre d'octets).
- nom-colonne
- Indique une colonne de la table qui est incluse dans la clé unique qui détermine la séquence de la table groupée par plage. Le type de données de la colonne doit être SMALLINT, INTEGER ou BIGINT (SQLSTATE 42611), et les colonnes doivent être définies comme NOT NULL (SQLSTATE 42831). La même colonne ne doit pas être identifiée plusieurs fois dans la clé de séquence. Le nombre de colonnes identifiées ne doit pas dépasser 64 (SQLSTATE 54008).
Une entrée d'index unique sera automatiquement créée dans le catalogue pour les colonnes de la séquence de touches spécifiée en ordre croissant pour chaque colonne. Le nom de l'index sera SQL, suivi d'un horodatage de type caractère (aammjjhhmmssxxx), avec SYSIBM comme nom de schéma. Un objet d'index réel n'est pas créé dans le stockage, car l'organisation de la table est ordonnée par cette clé. Si une clé primaire ou une contrainte unique est définie sur les mêmes colonnes que la clé de séquence de table groupée par plage, cette même entrée d'index est utilisée pour la contrainte.
Pour la spécification de séquence de clé, une contrainte de vérification existe pour refléter les contraintes de colonne. Si la clause DISALLOW OVERFLOW est spécifiée, le nom de la contrainte de vérification est RCT et la contrainte de vérification est appliquée. Si la clause ALLOW OVERFLOW est spécifiée, le nom de la contrainte de vérification est RCT_OFLOW et la contrainte de vérification n'est pas appliquée.
- STARTING FROM constant
- Indique la valeur constante à l'extrémité inférieure de la plage pour le nom de colonne. Les valeurs inférieures à la constante spécifiée ne sont autorisées que si l'option ALLOW OVERFLOW est spécifiée. Si le nom de colonne est une colonne SMALLINT ou INTEGER, la constante doit être une constante INTEGER. Si le nom de colonne est une colonne BIGINT, la constante doit être une constante INTEGER ou BIGINT (SQLSTATE 42821). Si une constante de début n'est pas spécifiée, la valeur par défaut est 1.
- ENDING AT constant
- Indique la valeur constante à l'extrémité supérieure de la plage pour nom de colonne. Les valeurs supérieures à la constante spécifiée ne sont autorisées que si l'option ALLOW OVERFLOW est spécifiée. La valeur de la constante de fin doit être supérieure à la constante de début. Si le nom de colonne est une colonne SMALLINT ou INTEGER, la constante doit être une constante INTEGER. Si le nom de colonne est une colonne BIGINT, la constante doit être une constante INTEGER ou BIGINT (SQLSTATE 42821).
- ALLOW OVERFLOW
- Indique que la table groupée par plage autorise les lignes avec des valeurs de clé qui se trouvent en dehors de la plage de valeurs définie. Lorsqu'une table groupée par plage est créée pour autoriser les dépassements, les lignes comportant des valeurs de clé en dehors de la plage sont placées à la fin de la plage définie sans ordre prédéterminé. Les opérations impliquant ces lignes de dépassement de capacité sont moins efficaces que les opérations sur les lignes ayant des valeurs de clé dans la plage définie.
- DISALLOW OVERFLOW
- Indique que la table en cluster de plage n'autorise pas les lignes avec des valeurs de clé qui ne se trouvent pas dans la plage de valeurs définie (SQLSTATE 23513). Les tables groupée par plage qui n'autorisent pas les dépassements de flux maintiendront toutes les lignes dans la séquence de clé ascendante.
La clause DISALLOW OVERFLOW ne peut pas être spécifiée si la table est une table de requêtes matérialisée regroupée par plage (SQLSTATE 429BG).
- PCTFREE integer
- Indique le pourcentage de chaque page qui doit être laissée comme espace libre. La première ligne de chaque page est ajoutée sans restriction. Lorsque des lignes supplémentaires sont ajoutées à une page, au moins un pourcentage entier de la page est laissé comme espace libre. La valeur de l'entier peut être comprise entre 0 et 99. Une valeur PCTFREE de -1 dans le catalogue système (SYSCAT.TABLES) est interprétée comme la valeur par défaut. La valeur PCTFREE par défaut d'une page de table est 0.
- Indique une colonne de la table qui est incluse dans la clé unique qui détermine la séquence de la table groupée par plage. Le type de données de la colonne doit être SMALLINT, INTEGER ou BIGINT (SQLSTATE 42611), et les colonnes doivent être définies comme NOT NULL (SQLSTATE 42831). La même colonne ne doit pas être identifiée plusieurs fois dans la clé de séquence. Le nombre de colonnes identifiées ne doit pas dépasser 64 (SQLSTATE 54008).
- INSERT TIME
- Indique que les lignes sont regroupées dans la table par rapport au moment où elles sont insérées. Les lignes sont insérées à l'extrémité logique de l'objet de table au lieu de rechercher de l'espace disponible.
Une table organisée par heure d'insertion est appelée table de regroupement de temps d'insertion (ITC). Ce type de table peut utiliser REORG TABLE RECLAIM EXTENTS pour récupérer les extensions disponibles pour une utilisation immédiate par d'autres objets de l'espace table.
Les données sont regroupées à l'aide d'une dimension virtuelle créée implicitement. Un index de bloc de groupement est automatiquement conservé pour cette dimension virtuelle. La dimension virtuelle ne peut pas être manipulée et elle n'utilise aucun espace pour chaque ligne qui existe dans la table. Les pages de la table sont disposées en blocs de taille égale, ce qui correspond à la taille de l'étendue de l'espace table.
La clause ORGANIZE BY INSERT TIME ne peut pas être spécifiée si la table est une table basée sur un type structuré (SQLSTATE 428DH).
- DATA CAPTURE
- Indique si des informations supplémentaires pour la réplication des données inter-base de données doivent être écrites dans le journal. Cette clause ne peut pas être spécifiée lors de la création d'une sous-table (SQLSTATE 428DR).
Si la clause n'est pas spécifiée et que la table n'est pas une table basée sur un type structuré, la valeur par défaut est déterminée par le paramètre DATA CAPTURE du schéma au moment de la création de la table.
- NONE
- Indique qu'aucune information supplémentaire ne sera consignée.
- CHANGES
- Indique que des informations supplémentaires concernant les modifications SQL apportées à cette table seront consignées dans le journal. Cette option est requise si cette table est répliquée et que le programme Capture est utilisé pour capturer les modifications de cette table à partir du journal.
Si la table est une table basée sur un type structuré qui n'est pas une sous-table, cette option n'est pas prise en charge (SQLSTATE 428DH).
- IN tablespace-name,...
- Identifie les espaces table dans lesquels la table sera créée. Les espaces table doivent exister, ils doivent se trouver dans le même groupe de partitions de base de données et ils doivent être tous des fichiers DMS nromaux ou tous les grands DMS ou tous les espaces table SMS (SQLSTATE 42838) sur lesquels l'ID autorisation de l'instruction contient le privilège USE.
Un maximum d'une clause IN est autorisé au niveau de la table. Tous les espaces table de données utilisés par une table doivent avoir la même taille de page et la même taille d'extension.
Si un seul espace table est spécifié, toutes les parties de la table sont stockées dans cet espace table. Cette clause ne peut pas être spécifiée lors de la création d'une sous-table (SQLSTATE 42613), car l'espace table est hérité de la table racine de la hiérarchie de tables.
Si cette clause n'est pas spécifiée, le gestionnaire de base de données choisit un espace table (à partir de l'ensemble des espaces table existants dans la base de données) avec la taille de page suffisante et où la taille de ligne se situe dans la limite de taille de ligne de la taille de page sur laquelle l'ID autorisation de l'instruction dispose du privilège USE.
Si plusieurs espaces table sont admissibles, choisissez l'espace table dans l'ordre de préférence suivant, en fonction de la façon dont l'ID autorisation de l'instruction a reçu le privilège USE sur l'espace table:- ID autorisation
- Rôle auquel l'ID d'autorisation est accordé
- Groupe auquel l'ID d'autorisation appartient
- Un rôle auquel appartient l'ID autorisation appartient à un groupe.
- PUBLIC
- Un rôle auquel le PUBLIC est accordé
La détermination de l'espace table peut changer si:- Les espaces table sont supprimés ou créés
- Les privilèges USE sont accordés ou révoqués
Les tables partitionnées peuvent avoir leurs partitions de données réparties sur plusieurs espaces table. Lorsque plusieurs espaces table sont spécifiés, tous les espaces table doivent exister et ils doivent tous être des espaces table SMS ou DMS standard ou des espaces table DMS (SQLSTATE 42838). L'ID autorisation de l'instruction doit contenir le privilège USE sur tous les espaces table spécifiés.
La taille de page suffisante d'une table est déterminée par le nombre d'octets de la ligne ou le nombre de colonnes. Pour plus d'informations, voir Limites de taille de ligne.
Lorsqu'une table est placée dans un grand espace table :- La table peut être plus grande qu'une table dans un espace table standard. Pour plus d'informations sur les limites d'espace table et table, voir
Limites SQL
. - La table peut prendre en charge plus de 255 lignes par page de données, ce qui peut améliorer l'utilisation de l'espace sur les pages de données.
- Les index définis sur la table requièrent une entrée supplémentaire de 2 octets par ligne, par rapport aux index définis sur une table résidant dans un espace table normal.
- CYCLE ou NO CYCLE
- Indique si le nombre de partitions de données sans espace table explicite peut dépasser le nombre d'espaces table spécifiés.
- CYCLE
- Indique que si le nombre de partitions de données sans espace table explicite dépasse le nombre d'espaces table spécifiés, les espaces table sont affectés à des partitions de données en mode round-robin.
- NO CYCLE
- Indique que le nombre de partitions de données sans espace table explicite ne doit pas dépasser le nombre d'espaces tables spécifiés (SQLSTATE 428G1). Cette option empêche l'affectation circulaire des espaces table aux partitions de données.
tablespace-options - Indique l'espace table dans lequel les index ou les valeurs de colonnes longues doivent être stockés. Pour plus de détails sur les types d'espace table, voir
CREATE TABLESPACE
.- INDEX IN tablespace-name
- Identifie l'espace table dans lequel les index d'une table non partitionnée ou d'index non partitionnés sur une table partitionnée doivent être créés. L'espace table spécifié doit exister. Il doit s'agir d'un espace table DMS si la table contient des données dans des espaces table DMS ou un espace table SMS si la table partitionnée contient des données dans des espaces table SMS. Il doit s'agir d'un espace table sur lequel l'ID autorisation de l'instruction détient le privilège USE et il doit se trouver dans le même groupe de partitions de base de données que le nom d'espace table (SQLSTATE 42838).
La spécification de l'espace table contenant des index peut être effectuée lorsqu'une table est créée ou, dans le cas de tables partitionnées, elle peut être effectuée en spécifiant la clause IN de l'instruction CREATE INDEX pour un index non partitionné. La vérification du privilège USE sur l'espace table est effectuée au moment de la création de la table, et non lors de la création ultérieure d'un index.
Pour un index non partitionné sur une table partitionnée, le stockage de l'index est le suivant :- Espace table par la clause IN de l'instruction CREATE INDEX
- Espace table de niveau table spécifié pour la clause INDEX IN de l'instruction CREATE TABLE
- Si aucun des éléments précédents n'est spécifié, l'index est stocké dans l'espace table de la première partition de données connectée ou visible.
- LONG IN tablespace-name
- Identifie les espaces table dans lesquels les valeurs des colonnes longues doivent être stockées. Les colonnes longues incluent celles avec les types de données LOB, le type XML, des types distincts avec l'un de ces types comme types de source, ou toute colonne définie avec des types structurés définis par l'utilisateur dont les valeurs ne peuvent pas être stockées en ligne. Cette option n'est admise que si la clause IN identifie un espace table DMS.Remarque: Un espace table de stockage automatique est également un espace table DMS.
L'espace table spécifié doit exister. Il peut s'agir d'un espace table normal s'il s'agit du même espace table dans lequel les données sont stockées ; sinon, il doit s'agir d'un espace table DMS important sur lequel l'ID autorisation de l'instruction détient le privilège USE. Il doit également se trouver dans le même groupe de partitions de base de données que le nom d'espace tablespace (SQLSTATE 42838).
La spécification de l'espace table contenant des colonnes longues, LOB ou XML ne peut être effectuée que lorsqu'une table est créée. La vérification du privilège USE s'effectue à l'heure de création de la table, et non pas lorsqu'une colonne longue ou LOB est ajoutée ultérieurement.
Pour connaître les règles régissant l'utilisation de la clause LONG IN avec des tables partitionnées, voir
Comportement des objets LOB dans les tables partitionnées
.
distribution-clause - Indique le partitionnement de base de données ou la façon dont les données sont distribuées sur plusieurs partitions de base de données.
- DISTRIBUTE BY HASH (column-name,...)
- Indique l'utilisation de la fonction de hachage par défaut sur les colonnes spécifiées comme méthode de distribution sur les partitions de base de données. Les colonnes spécifiées sont appelées clés de distribution.
- Chaque nom de colonne doit être un nom non qualifié qui identifie une colonne de la table (SQLSTATE 42703).
- La même colonne ne doit pas être identifiée plusieurs fois (SQLSTATE 42709).
- Une colonne ne peut pas être utilisée comme élément d'une clé de distribution si son type de données est BLOB, CLOB, DBCLOB, XML, un type distinct basé sur l'un de ces types ou un type structuré (SQLSTATE 42962).
- La clé de distribution ne peut pas contenir une colonne ROW CHANGE TIMESTAMP (SQLSTATE 429BV).
- Une clé de distribution ne peut pas être spécifiée pour une table qui est une sous-table, car la clé de distribution est héritée de la table racine dans la hiérarchie de tables (SQLSTATE 42613).
- Une clé de distribution ne peut pas contenir de colonnes de début, de fin de ligne ou d'ID de début de transaction.
- Si aucune clause DISTRIBUTE BY HASH n'est spécifiée et si la table réside dans un groupe de partitions de base de données à partitions multiples avec plusieurs partitions de base de données, une clé de distribution par défaut est automatiquement définie.
- Les colonnes de la clé de distribution doivent être un sous-ensemble des colonnes qui constituent des contraintes uniques appliquées.
Si aucune des colonnes ne répond aux exigences d'une clé de distribution par défaut, la table est créée sans. Ces tables sont autorisées uniquement dans les espaces table définis sur des groupes de partitions de base de données à partition unique.
Pour les tables des espaces table définis sur des groupes de partitions de base de données à partition unique, toute collection de colonnes avec des types de données valides pour une clé de distribution peut être utilisée pour définir la clé de distribution. Si vous ne spécifiez pas cette clause, aucune clé de distribution n'est créée.
Pour connaître les restrictions relatives à la clé de distribution, voir Règles.
- DISTRIBUTE BY RANDOM
- Indique que le gestionnaire de base de données sélectionne une clé de distribution pour répartir les données équitablement entre toutes les partitions de base de données du groupe de partitionnement de base de données. Le gestionnaire de base de données utilise deux méthodes pour atteindre cet objectif:
- Random by unique : si la table inclut une clé unique ou principale, elle utilise les caractéristiques uniques des colonnes de clé pour créer une répartition aléatoire des données. Les colonnes de la clé unique ou principale sont utilisées comme clés de distribution.
- Random by generation : si la table n'a pas de clé unique ou principale, le gestionnaire de base de données inclura une colonne dans la table pour générer et stocker une valeur générée à utiliser dans la fonction de hachage. La colonne sera créée avec la clause IMPLICITLY HIDDEN de sorte qu'elle n'apparaisse pas dans les requêtes sauf si elle est explicitement incluse. La valeur de la colonne est générée automatiquement lorsque de nouvelles lignes sont ajoutées à la table. Par défaut, le nom de la colonne est RANDOM_DISTRIBUTION_KEY. En cas de collision avec la colonne existante, un nom non conflictable est généré par le gestionnaire de base de données.
- DISTRIBUTE BY REPLICATION
- Indique que les données stockées dans la table sont répliquées physiquement sur chaque partition de base de données du groupe de partitions de base de données pour les espaces table dans lesquels la table est définie. Cela signifie qu'une copie de toutes les données de la table existe sur chaque partition de base de données. Cette option ne peut être spécifiée que pour une table de requêtes matérialisée (SQLSTATE 42997).
partitioning-clause - Indique comment les données sont partitionnées dans une partition de base de données.
- PARTITION BY RANGE range-partition-spec
- Indique le schéma de partitionnement de table pour la table.
- partition-expression
- Indique les données de clé sur lesquelles la plage est définie pour déterminer la partition de données cible des données.
- nom-colonne
- Identifie une colonne de la clé de partitionnement de table. Le nom de colonne doit être un nom non qualifié qui identifie une colonne de la table (SQLSTATE 42703). La même colonne ne doit pas être identifiée plusieurs fois (SQLSTATE 42709). Aucune colonne avec un type de données BLOB, CLOB, DBCLOB, XML, type distinct basé sur n'importe lequel de ces types, ou type structuré peut être utilisée dans le cadre d'une clé de partitionnement de table (SQLSTATE 42962).
Les littéraux numériques utilisés dans la spécification de plage sont régis par les règles des littéraux numériques. Tous les littéraux numériques (à l'exception des valeurs spéciales à virgule flottante décimale) utilisés dans les plages correspondant aux colonnes numériques sont interprétés comme des entiers, des constantes à virgule flottante ou des constantes décimales, conformément aux règles spécifiées pour les constantes numériques. Par conséquent, pour les colonnes à virgule flottante décimale, la valeur de constante numérique minimale et maximale pouvant être utilisée dans la spécification de plage d'une partition de données est la plus petite valeur DOUBLE et la plus grande valeur DOUBLE, respectivement. Les valeurs spéciales en virgule flottante décimale peuvent être utilisées dans la spécification de plage. Toutes les valeurs spéciales à virgule flottante décimale sont interprétées comme supérieures à MINVALUE et inférieures à MAXVALUE.
Les colonnes de partitionnement de table ne peuvent pas contenir de colonne ROW CHANGE TIMESTAMP (SQLSTATE 429BV). Le nombre de colonnes identifiées ne doit pas dépasser 16 (SQLSTATE 54008).
NULLS LAST ou NULLS FIRST - Indique le placement de la partition des lignes ayant des valeurs NULL dans les colonnes de clé de partitionnement de table. Ces clauses n'affectent pas l'ordre des lignes renvoyées dans une clause ORDER BY.
- NULLS LAST
- Indique que les valeurs NULL sont comparées à la valeur la plus élevée possible et sont placées dans une plage se terminant par MAXVALUE.
- NULLS FIRST
- Indique que les valeurs NULL sont comparées à la valeur la plus faible possible et sont placées dans une plage commençant à MINVALUE.
- Identifie une colonne de la clé de partitionnement de table. Le nom de colonne doit être un nom non qualifié qui identifie une colonne de la table (SQLSTATE 42703). La même colonne ne doit pas être identifiée plusieurs fois (SQLSTATE 42709). Aucune colonne avec un type de données BLOB, CLOB, DBCLOB, XML, type distinct basé sur n'importe lequel de ces types, ou type structuré peut être utilisée dans le cadre d'une clé de partitionnement de table (SQLSTATE 42962).
- partition-element
- Indique les plages pour une clé de partitionnement de données et l'espace table dans lequel les lignes de la table de la plage seront stockées.
- PARTITION partition-name
- Nomme la partition de données. Le nom ne doit pas être identique à une autre partition de données pour la table (SQLSTATE 42710). Si cette clause n'est pas spécifiée, le nom sera
PART
suivi du format de caractère d'un entier pour que le nom soit unique pour la table. - boundary-spec
- Indique les limites d'une partition de données. La partition de données la plus basse doit inclure une clause de début et la partition de données la plus élevée doit inclure une clause de fin (SQLSTATE 56016). Les partitions de données entre les plus faibles et les plus élevées peuvent inclure une clause de début, une clause de fin ou les deux clauses. Si seule la clause de fin est spécifiée, la partition de données précédente doit également avoir inclus une clause de fin (SQLSTATE 56016).
- starting-clause
- Indique le bas de la plage pour une partition de données. Il doit exister au moins une valeur de début spécifiée et pas plus de valeurs que le nombre de colonnes dans la clé de partitionnement de données (SQLSTATE 53038). Si le nombre de valeurs est inférieur au nombre de colonnes, les valeurs restantes sont implicitement MINVALUE.
- STARTING FROM
- Introduit la clause de début.
- constant
- Indique une valeur constante avec un type de données pouvant être affecté au type de données du nom de colonne auquel elle correspond (SQLSTATE 53045). La valeur ne doit pas se trouver dans la plage de toute autre spécification de limite pour la table (SQLSTATE 56016).
- MINVALUE
- Indique une valeur inférieure à la valeur la plus faible possible pour le type de données du nom de colonne auquel elle correspond.
- MAXVALUE
- Indique une valeur supérieure à la valeur maximale possible pour le type de données du nom de colonne auquel elle correspond.
- INCLUSIVE
- Indique que les valeurs de plage spécifiées doivent être incluses dans la partition de données.
- EXCLUSIVE
- Indique que les valeurs constantes spécifiées doivent être exclues de la partition de données. Cette spécification est ignorée lorsque MINVALUE ou MAXVALUE est spécifié.
- ending-clause
- Indique l'extrémité supérieure de la plage pour une partition de données. Il doit exister au moins une valeur de début spécifiée et pas plus de valeurs que le nombre de colonnes dans la clé de partitionnement de données (SQLSTATE 53038). Si le nombre de valeurs est inférieur au nombre de colonnes, les valeurs restantes sont implicitement MAXVALUE.
- ENDING AT
- Introduit la clause de fin.
- constant
- Indique une valeur constante avec un type de données pouvant être affecté au type de données du nom de colonne auquel elle correspond (SQLSTATE 53045). La valeur ne doit pas se trouver dans la plage de toute autre spécification de limite pour la table (SQLSTATE 56016).
- MINVALUE
- Indique une valeur inférieure à la valeur la plus faible possible pour le type de données du nom de colonne auquel elle correspond.
- MAXVALUE
- Indique une valeur supérieure à la valeur maximale possible pour le type de données du nom de colonne auquel elle correspond.
- INCLUSIVE
- Indique que les valeurs de plage spécifiées doivent être incluses dans la partition de données.
- EXCLUSIVE
- Indique que les valeurs constantes spécifiées doivent être exclues de la partition de données. Cette spécification est ignorée lorsque MINVALUE ou MAXVALUE est spécifié.
- IN tablespace-name
- Indique l'espace table dans lequel la partition de données doit être stockée. L'espace table nommé doit avoir la même taille de page, se trouver dans le même groupe de partitions de base de données et gérer l'espace de la même manière que les autres espaces table de la table partitionnée (SQLSTATE 42838) ; il doit s'agir d'un espace table sur lequel l'ID autorisation de l'instruction contient le privilège USE. Si cette clause n'est pas spécifiée, un espace table est affecté par défaut dans une mode circulaire à partir de la liste des espaces table spécifiés pour la table. Si aucun espace table n'a pas été spécifié pour les objets LOB à l'aide de la clause LONG IN, les objets LOB sont placés dans le même espace table que les autres lignes de la partition de données. Pour les tables partitionnées, la clause LONG IN peut être utilisée pour fournir une liste d'espaces table. Cette liste est utilisée en mode round robin-mode pour placer des objets LOB pour chaque partition de données. Pour connaître les règles régissant l'utilisation de la clause LONG IN avec des tables partitionnées, voir
Comportement des objets LOB dans les tables partitionnées
.Si la clause INDEX IN n'est pas spécifiée dans l'instruction CREATE TABLE ou CREATE INDEX, l'index est placé dans le même espace table que la première partition visible ou connectée de la table.
- INDEX IN tablespace-name
- Indique l'espace table dans lequel l'index partitionné de la table partitionnée doit être stocké.
La clause INDEX IN de la partition au niveau de l'élément de partition affecte uniquement le stockage des index partitionnés. Le stockage de l'index est le suivant :
- Si la clause INDEX IN est spécifiée au niveau de la partition lorsque la table est créée, l'index partitionné est stocké dans l'espace table spécifié.
- Si la clause INDEX IN n'est pas spécifiée au niveau de la partition lorsque la table est créée, l'index partitionné est stocké dans l'epace table de la partition de données correspondante.
La clause INDEX IN ne peut être spécifiée que si les espaces table de données sont des espaces table DMS et que l'espace table spécifié par la clause INDEX IN est un espace table DMS. Si l'espace table de données est un espace table SMS, une erreur est renvoyée (SQLSTATE 42839).
- LONG IN tablespace-name
- Identifie les espaces table dans lesquels les valeurs des colonnes longues doivent être stockées. Les colonnes longues comprennent les types de données LOB, le type XML, les types distincts avec n'importe lequel des types source, ou toute colonne définie avec des types structurés définis par l'utilisateur dont les valeurs ne peuvent pas être stockées en ligne. Cette option n'est admise que si la clause IN identifie un espace table DMS.Remarque: Un espace table de stockage automatique est également un espace table DMS.
L'espace table spécifié doit exister. Il peut s'agir d'un espace table normal s'il s'agit du même espace table dans lequel les données sont stockées ; sinon, il doit s'agir d'un espace table DMS important sur lequel l'ID autorisation de l'instruction détient le privilège USE. Il doit également se trouver dans le même groupe de partitions de base de données que le nom d'espace tablespace (SQLSTATE 42838).
La spécification de l'espace table contenant des colonnes longues, LOB ou XML ne peut être effectuée que lorsqu'une table est créée. La vérification du privilège USE s'effectue à l'heure de création de la table, et non pas lorsqu'une colonne longue ou LOB est ajoutée ultérieurement.
Pour connaître les règles régissant l'utilisation de la clause LONG IN avec des tables partitionnées, voir
Comportement des objets LOB dans les tables partitionnées
. - EVERY (constant)
- Indique la largeur de chaque plage de partition de données lors de l'utilisation de la forme générée automatiquement de la syntaxe. Les partitions de données seront créées à partir de la valeur STARTING FROM et contenant ce nombre de valeurs dans la plage. Cette forme de syntaxe n'est prise en charge que pour les tables partitionnées par une seule colonne numérique ou date-heure (SQLSTATE 53038).
Si la colonne de clé de partitionnement est un type numérique, la valeur de début de la première partition est la valeur spécifiée dans la clause de début. La valeur de fin de la première partition et de toutes les autres partitions est calculée en ajoutant la valeur de départ de la partition à la valeur d'incrément spécifiée sous la forme d'une constante dans la clause EVERY. La valeur de départ de toutes les autres partitions est calculée en prenant la valeur de départ de la partition précédente et en ajoutant la valeur d'incrément spécifiée sous la forme Constante dans la clause EVERY.
Si la colonne de clé de partitionnement est une DATE ou un TIMESTAMP, la valeur de début de la première partition est la valeur spécifiée dans la clause de début. La valeur de fin de la première partition et de toutes les autres partitions est calculée en ajoutant la valeur de départ de la partition à la valeur d'incrément spécifiée sous la forme d'une durée qualifiée dans la clause EVERY. La valeur de départ de toutes les autres partitions est calculée en prenant la valeur de départ de la partition précédente et en ajoutant la valeur d'incrément spécifiée comme durée qualifiée dans la clause EVERY.
Pour une colonne numérique, la valeur EVERY doit être une constante numérique positive, et pour une colonne de date-heure, la valeur EVERY doit être une durée qualifiée (SQLSTATE 53045).
- COMPRESS
- Indique si la compression de ligne doit être utilisée pour la table.Le paramètre de configuration ddl_compression_def détermine la valeur par défaut du mot clé COMPRESS.
- NO
- La compression de ligne est désactivée.
- OUI
- La compression de ligne est activée. Les opérations d'insertion et de mise à jour sur la table utilisent la compression des lignes. Tous les objets de stockage XML qui existent sont également compressés. Pour une compression de lignes adaptative et classique, un dictionnaire de compression de niveau table est automatiquement créé une fois que la table est suffisamment renseignée avec les données. Cela s'applique également aux données de l'objet de stockage XML.S'il existe suffisamment de données dans l'objet de stockage XML, un dictionnaire de compression est automatiquement créé et les documents XML sont soumis à la compression.Remarque: La compression appliquée à l'objet de stockage XML est la même, que vous utilisiez la compression de ligne adaptative ou classique.
Pour la compression de lignes adaptative, les dictionnaires de compression de niveau page sont créés ou mis à jour dès que les données sont insérées ou modifiées dans la table.
- ADAPTIVE
- Active la compression adaptative, et les enregistrements doivent être compressés avec un niveau table et un dictionnaire de compression de niveau page. La fonctionnalité de COMPRESS YES ADAPTIVE est une sur-ensemble de la fonctionnalité COMPRESS YES STATIC. Il s'agit de la valeur par défaut lorsque COMPRESS YES est spécifié explicitement.
- STATIC
- Active la compression de ligne classique à l'aide d'un dictionnaire de compression de niveau table. Il s'agit de la même fonctionnalité de compression de ligne que celle qui existait dans les versions précédentes de Db2 . Il s'agit de la valeur par défaut lorsque la compression de ligne est utilisée par défaut et que COMPRESS YES n'est pas spécifié explicitement.
- VALUE COMPRESSION
- Détermine le format de ligne à utiliser. Chaque type de données possède un nombre d'octets différent selon le format de ligne utilisé. Pour plus d'informations, voir Nombre d'octets. Si la table est une table basée sur un type structuré, cette option n'est prise en charge que sur la table racine de la hiérarchie de tables basées sur un type structuré (SQLSTATE 428DR).
La valeur NULL est stockée à l'aide de 3 octets. Il s'agit du même espace ou moins que lorsque VALUE COMPRESSION n'est pas actif pour les colonnes de tous les types de données, à l'exception de CHAR (1). Si une colonne est définie comme indéfinie, elle n'a aucun effet sur le calcul de la taille de ligne. Les valeurs de données de longueur zéro pour les colonnes dont le type de données sont VARCHAR, VARGRAPHIC, LONG VARCHAR, LONG VARGRAPHIC, CLOB, DBCLOB, VARBINARY, BLOB ou XML doivent être stockées à l'aide de 2 octets uniquement, ce qui est inférieur à la mémoire requise lorsque VALUE COMPRESSION n'est pas active. Lorsqu'une colonne est définie à l'aide de l'option COMPRESS SYSTEM DEFAULT, cela permet également de stocker la valeur par défaut du système pour la colonne à l'aide de 3 octets de mémoire totale. Le format de ligne utilisé pour prendre en charge ce paramètre détermine le nombre d'octets pour chaque type de données et tend à provoquer une fragmentation des données lors de la mise à jour vers ou à partir de la valeur null, d'une valeur de longueur zéro ou de la valeur par défaut du système.
- WITH RESTRICT ON DROP
- Indique que la table ne peut pas être supprimée et que l'espace table qui contient la table ne peut pas être supprimé.
- NOT LOGGED INITIALLY
- Toutes les modifications apportées à la table par une opération Insert, Delete, Update, Create Index, Drop Index ou Alter Table dans la même unité de travail dans laquelle la table est créée ne sont pas consignées. Pour d'autres considérations lors de l'utilisation de cette option, voir la section
Remarques
de cette instruction.Toutes les modifications de catalogue et les informations relatives au stockage sont consignées, de même que toutes les opérations effectuées sur la table dans les unités de travail suivantes.
Remarque: Si une activité non consignée se produit sur une table pour laquelle l'attribut NOT LOGGED INITIAL est activé et si une instruction échoue (entraînant une annulation) ou qu'une instruction ROLLBACK TO SAVEPOINT est exécutée, l'unité de travail entière est annulée (SQL1476N). De plus, la table pour laquelle l'attribut NOT LOGGED INITIALLY a été activé est marquée comme étant inaccessible une fois l'annulation effectuée et ne peut être supprimée que. Par conséquent, la possibilité d'erreurs dans l'unité de travail dans laquelle l'attribut NOT LOGGED INITIALLY est activé doit être réduite au minimum. - CCSID
- Indique le schéma de codage pour les données de chaîne stockées dans la table. Si la clause CCSID n'est pas spécifiée, la valeur par défaut est CCSID UNICODE pour les bases de données Unicode et CCSID ASCII pour toutes les autres bases de données.
- ASCII
- Indique que les données de chaîne sont codées dans la page de codes de la base de données. Si la base de données est une base de données Unicode, le CCSID ASCII ne peut pas être spécifié (SQLSTATE 56031).
- UNICODE
- Indique que les données de chaîne sont codées en Unicode. Si la base de données est une base de données Unicode, les données relatives aux caractères se trouvent à l'adresse UTF-8 et les données graphiques à l'adresse UCS-2. Si la base de données n'est pas une base de données Unicode, les données des caractères sont en UTF-8.Si la base de données n'est pas une base de données Unicode, des tables peuvent être créées avec le CCSID UNICODE, mais les règles suivantes s'appliquent:
- La séquence de classement alternative doit être spécifiée dans la configuration de la base de données avant de créer la table (SQLSTATE 56031). Les tables CCSID UNICODE collent avec la séquence de classement alternative spécifiée dans la configuration de la base de données.
- Les tables ou les fonctions de table créées avec le CCSID ASCII, ainsi que les tables ou les fonctions de table créées avec le CCSID UNICODE, ne peuvent pas être utilisées dans une seule instruction SQL (SQLSTATE 53090). Cela s'applique aux tables et fonctions de table référencées directement dans l'instruction, ainsi qu'aux tables et fonctions de table qui sont référencées indirectement (par exemple, via des contraintes d'intégrité référentielle, des déclencheurs, des tables de requêtes matérialisées et des tables dans le corps de vues).
- Les tables qui ont été créées avec le CCSID UNICODE ne peuvent pas être référencées dans des fonctions SQL ou des méthodes SQL (SQLSTATE 560C0).
- Une instruction SQL faisant référence à une table créée avec le CCSID UNICODE ne peut pas appeler une fonction SQL ou une méthode SQL (SQLSTATE 53090).
- Les types graphiques, le type XML et les types définis par l'utilisateur ne peuvent pas être utilisés dans les tables CCSID UNICODE (SQLSTATE 560C1).
- Les types de données ancrés ne peuvent pas ancrer les colonnes d'une table créée avec le CCSID UNICODE (SQLSTATE 428HS).
- Les tables Explain ne peuvent pas être créées avec le CCSID UNICODE (SQLSTATE 55002).
- Les tables temporaires créées et les tables temporaires déclarées ne peuvent pas être créées avec le CCSID UNICODE (SQLSTATE 56031).
- Les tables CCSID UNICODE ne peuvent pas être créées dans une instruction CREATE SCHEMA (SQLSTATE 53090).
- La table d'exceptions d'une opération de chargement doit avoir le même CCSID que la table cible pour l'opération (SQLSTATE 428A5).
- La table d'exceptions d'une instruction SET INTEGRITY doit avoir le même CCSID que la table cible pour l'instruction (SQLSTATE 53090).
- La table cible des données du moniteur d'événements ne doit pas être déclarée comme CCSID UNICODE (SQLSTATE 55049).
- Les instructions SQL sont toujours interprétées dans la page de codes de la base de données. En particulier, cela signifie que chaque caractère dans les littéraux, les littéraux hexadécimales et les identificateurs délimités doit avoir une représentation dans la page de codes de la base de données ; sinon, le caractère sera remplacé par le caractère de substitution.
Les variables hôte de l'application sont toujours dans la page de codes d'application, quel que soit le CCSID des tables dans les instructions SQL qui sont appelées. Le gestionnaire de base de données effectue les conversions de page de codes nécessaires pour convertir les données entre la page de codes d'application et la page de codes de section. La variable de registre DB2CODEPAGE peut être définie sur le client pour modifier la page de codes d'application.
- SECURITY POLICY
- Nomme la stratégie de sécurité à associer à la table.
- policy-name
- Identifie une règle de sécurité qui existe déjà sur le serveur en cours (SQLSTATE 42704). Cette clause n'active pas la protection de ligne ou de colonne par elle-même. Pour plus d'informations, voir Protection des données à l'aide de LBAC.
- OPTIONS (table-option-name string-constant, ...)
- Les options de table permettent d'identifier la table de base distante. table-option-name est le nom de l'option. string-constant indique le paramètre de l'option de table. string-constant doit être placé entre des guillemets simples.
Le serveur distant (nom du serveur indiqué dans l'instruction CREATE SERVER) doit être spécifié dans la clause OPTIONS. La clause OPTIONS peut également être utilisée pour remplacer le schéma ou le nom non qualifié de la table de base distante créée.
Il est recommandé d'indiquer un nom de schéma. Si aucun nom de schéma distant n'est spécifié, le qualificatif du nom de table est utilisé. Si le nom de la table n'a pas de qualificatif, l'ID autorisation de l'instruction est utilisé.
Si un nom non qualifié pour la table de base éloignée n'est pas spécifié, le nom de table est utilisé.
Règles
- La somme des nombres d'octets des colonnes, y compris les longueurs en ligne de toutes les colonnes de type structuré ou XML, ne doit pas être supérieure à la limite de taille de ligne basée sur la taille de page de l'espace table (SQLSTATE 54010). Pour plus d'informations, voir Nombre d'octets. Pour les tables basées sur un type structuré, le nombre d'octets est appliqué aux colonnes de la table racine de la hiérarchie de tables et à chaque colonne supplémentaire introduite par chaque sous-table de la hiérarchie de tables (les colonnes de sous-table supplémentaires doivent être considérées comme pouvant prendre une valeur null pour le nombre d'octets, même si elles sont définies comme pouvant prendre une valeur null). Il existe également 4 octets supplémentaires de temps système pour identifier la sous-table à laquelle chaque ligne appartient.
- Le nombre de colonnes d'une table ne peut pas dépasser 1 012 (SQLSTATE 54011). Pour les tables basées sur un type structuré, le nombre total d'attributs des types de toutes les sous-tables de la hiérarchie de tables ne peut pas dépasser 1010. Pour une distribution aléatoire
n tableaux utilisant la méthode aléatoire par génération, le nombre de colonnes ne peut excéder 1 011 en raison de l'inclusion de la colonne RANDOM_DISTRIBUTION_KEY .The first primary requirement - Une colonne d'identificateur d'objet d'une table basée sur un type structuré ne peut pas être mise à jour (SQLSTATE 42808).
- Toute contrainte de clé primaire ou unique appliquée définie sur la table doit être un sur-ensemble de la clé de distribution (SQLSTATE 42997).
- Les règles suivantes s'appliquent uniquement aux bases de données de partitions de bases de données multiples.
- Les tables qui sont composées uniquement de colonnes avec des types LOB, XML, un type distinct basé sur l'un de ces types, ou un type structuré ne peuvent être créées que dans des espaces table définis sur des groupes de partitions de base de données à partition unique.
- La définition de clé de distribution d'une table dans un espace table défini sur un groupe de partitions de base de données de partitions multiples ne peut pas être modifiée.
- La colonne de clé de distribution d'une table typée doit être la colonne OID.
- Les tables de transfert partitionnées ne sont pas prises en charge.
- Pour les bases de données s'exécutant dans un environnement Db2 pureScale, la clause ORGANIZE BY ne peut pas être spécifiée (SQLSTATE 42997).
- Les restrictions suivantes s'appliquent aux tables table groupée par plage :
- Une table groupée par plage ne peut pas être spécifiée dans un Db2 pureScale (SQLSTATE 42997).
- Impossible de créer un index de classification.
- La modification de la table pour ajouter une colonne n'est pas prise en charge.
- La modification du tableau pour modifier le type de données d'une colonne n'est pas prise en charge.
- La modification de la table de modification de PCTFREE n'est pas prise en charge.
- La modification de la table à définir APPEND ON n'est pas prise en charge.
- Les statistiques DETAILED ne sont pas disponibles.
- L'utilitaire de chargement ne peut pas être utilisé pour remplir la table.
- Les colonnes ne peuvent pas être de type XML.
- Impossible de créer une table de distribution aléatoire.
- Les restrictions suivantes s'appliquent aux tables de distribution aléatoires:
- Impossible de définir une table basée sur un type structuré
- Impossible de définir une table groupée par plage
- Impossible de définir une table de requêtes matérialisée
- Impossible de définir une table de transfert
- Pour les tables de distribution aléatoires qui utilisent la méthode de génération « random by » (cela se produit lorsqu'une table de distribution aléatoire est créée sans clé primaire ou unique), les restrictions supplémentaires suivantes s'appliquent:
- Ne peut pas être utilisé en tant que tables d'exceptions lorsque des contraintes sont vérifiées en bloc, telles que lors des opérations de chargement ou lors de l'exécution de l'instruction SET INTEGRITY
- Ne peut pas être utilisé comme table d'explication
- Une table n'est pas protégée, sauf si elle est associée à une politique sécurité et qu'elle inclut une colonne de type DB2SECURITYLABEL ou une colonne définie avec la clause SECURED WITH. La première indique que la table est une table protégée avec une granularité au niveau des lignes et la seconde indique que la table est une table protégée avec une granularité au niveau des colonnes.
- La déclaration d'une colonne de type DB2SECURITYLABEL échoue si la politique de sécurité n'est pas associée à la table (SQLSTATE 55064).
- Une politique de sécurité ne peut pas être ajoutée à une table basée sur un de type structuré (SQLSTATE 428DH), à une table de requêtes matérialisée ou à une table de transfert (SQLSTATE 428FG).
- Une expression de table imbriquée à tolérance des erreurs ne peut pas être spécifiée dans l'instruction FULLSELECT d'une définition de requête matérialisée (SQLSTATE 428GG).
- Lorsque vous créez une table de requêtes matérialisée et que l'une des tables de base dont elle dépend est protégée par un contrôle d'accès basé sur l'étiquette, les règles suivantes s'appliquent :
- Sécurité au niveau des lignes
- Une seule table de l'instruction fullselect de la table de requêtes matérialisée peut avoir un type de colonne DB2SECURITYLABEL (SQLSTATE 428FG).
- La colonne d'étiquette de sécurité de ligne doit être sélectionnée et référencée en tant que colonne autonome dans la liste SELECT la plus externe de la définition de table de requêtes matérialisée (SQLSTATE 428FG). La colonne correspondante de la table de requêtes matérialisée sera marquée comme colonne d'étiquette de sécurité de ligne.
- Sécurité au niveau des colonnes
- Si une table impliquée dans la définition de table de requêtes matérialisée possède une colonne protégée avec une étiquette de sécurité et que cette colonne apparaît dans la définition de table de requêtes matérialisée, la colonne correspondance dans la table de requêtes matérialisée hérite de l'étiquette de sécurité de cette colonne de la colonne. Pour plus de détails, reportez-vous aux exemples de cette rubrique.
- Lors de la création d'une table de requêtes matérialisée qui dépend d'une ou plusieurs tables protégées par un contrôle d'accès basé sur l'étiquette, toutes les tables de base doivent avoir le même objet de politique de sécurité (SQLSTATE, 428FG). La table de requêtes matérialisée est automatiquement protégée avec cet objet de politique de sécurité.
- Le libellé de sécurité associé à une colonne de table de requêtes matérialisée est calculé en tant qu'agrégat d'un ou plusieurs libellés de sécurité. Cet agrégat est constitué des libellés de sécurité associés aux colonnes des tables de base qui participent à la définition de cette colonne de table de requêtes matérialisée. L'agrégat comprend également les libellés de sécurité associés à toutes les colonnes de table de base qui apparaissent dans d'autres parties de la définition de table de requêtes matérialisée, telles que les clauses OÙ, COMMANDE PARet AYANT . Le fichier ALTER SECURITY POLICY contient une description de la manière dont deux libellés de sécurité sont agrégés. Pour plus de détails, reportez-vous aux exemples de cette rubrique.
- Lorsqu'une table de transfert est créée pour une table de requêtes matérialisée protégée par un contrôle d'accès basé sur l'étiquette, cette table de transfert comporte une protection automatique comme la table de requêtes matérialisée. Pour plus de détails, reportez-vous aux exemples de cette rubrique.
- Le contrôle d'accès basé sur l'étiquette est appliqué pour l'accès direct à une table de requêtes matérialisée, tout comme il est appliqué pour une table standard. Il n'existe pas de différence dans cette perspective. Lorsque le compilateur SQL effectue une requête via une table de requêtes matérialisée, le contrôle d'accès basé sur l'étiquette défini sur la table de requêtes matérialisée n'a pas besoin d'être appliqué. Le compilateur SQL utilise la table de requêtes matérialisée qui prend en compte les règles de contrôle d'accès basées sur l'étiquette à partir des tables de base appropriées.
- Sécurité au niveau des lignes
- La clause d'isolement ne peut pas être spécifiée dans full-select de la définition de requête matérialisée (SQLSTATE 42601).
- Les instructions de sous-sélection contenant une clause de demande de verrou ne sont pas éligibles pour le routage MQT.
- Les orthographes de caractères nationaux pour les types de données graphiques ne peuvent être spécifiées que dans une base de données Unicode (SQLSTATE 560AA).
- Les restrictions suivantes s'appliquent aux tables de type insert time clustering (ITC) :
- Les tables de CTCI ne sont pas prises en charge dans un espace table SMS (SQLSTATE 42838).
- Les index définis dans les tables ITC ne sont pas pris en charge dans un espace table SMS (SQLSTATE 42838).
Remarques
- La création d'une table avec un nom de schéma qui n'existe pas déjà aboutira à la création implicite de ce schéma, à condition que l'ID autorisation de l'instruction dispose des droits IMPLICIT_SCHEMA. Le propriétaire du schéma est SYSIBM. Le privilège CREATEIN sur le schéma est accordé à PUBLIC.
- Si une clé externe est spécifiée:
- Tous les packages avec une utilisation de suppression sur la table parent sont invalidés.
- Tous les packages avec une utilisation de mise à jour sur au moins une colonne de la clé parente sont invalidés.
- La création d'une sous-table entraîne l'invalidation de tous les packages qui dépendent d'une table dans une hiérarchie de tables.
- L'utilisation de NO ACTION ou RESTRICT comme règle de suppression ou de mise à jour des contraintes référentielles détermine le moment où la contrainte est appliquée:
- RESTRICT
- La règle de suppression ou de mise à jour est appliquée avant toutes les autres contraintes, y compris les contraintes référentielles avec des règles de modification telles que CASCADE ou SET NULL.
- NO ACTION
- La règle de suppression ou de mise à jour est appliquée après d'autres contraintes référentielles.
Table T1 is a parent of table T3; delete rule as noted below. Table T2 is a parent of table T3; delete rule CASCADE. CREATE VIEW V1 AS SELECT * FROM T1 UNION ALL SELECT * FROM T2 DELETE FROM V1Si la table T1 est un parent de la table T3:- Avec une règle de suppression de RESTRICT, une violation de restriction (SQLSTATE 23001) est élevée si t3 contient des lignes enfant pour les clés parent de T1.
- Avec une règle de suppression de NO ACTION, les lignes enfant peuvent être supprimées par la règle de suppression de CASCADE lors de la suppression de lignes de T2 avant que la règle de suppression de NO ACTION ne soit appliquée pour les suppressions à partir de T1. Si les suppressions de T2 n'entraînent pas la suppression de toutes les lignes enfant pour les clés parent de T1 dans T3, une violation de contrainte est élevée (SQLSTATE 23504).
- Pour les tables des espaces table définis sur plusieurs groupes de partitions de bases de données de partitions, envisagez la colocalisation de la table lors du choix des clés de distribution:
- Les tables doivent se trouver dans le même groupe de partitions de base de données pour la colocalisation. Les espaces table peuvent être différents, mais doivent être définis dans le même groupe de partitions de base de données.
- Les clés de distribution des tables doivent avoir le même nombre de colonnes, et les colonnes de clé correspondantes doivent être compatibles avec la partition de base de données pour la colocalisation.
- Le choix de la clé de distribution a également un impact sur la performance des jointures. Si une table est fréquemment jointe à une autre table, considéreles colonnes de jointure comme clé de distribution pour les deux tables.
- L'option NOT LOGGED INITIALLY est utile pour les situations où un ensemble de résultats important doit être créé avec des données provenant d'une autre source (une autre table ou un fichier) et la reprise de la table n'est pas nécessaire. L'utilisation de cette option permet de sauvegarder le temps système de consignation des données. Les considérations suivantes s'appliquent lorsque cette option est spécifiée:
- Lorsque l'unité de travail est validée, toutes les modifications apportées à la table pendant l'unité de travail sont vidées sur le disque.
- Lorsque vous exécutez l'utilitaire de récupération aval et qu'il rencontre un enregistrement de journal indiquant qu'une table de la base de données a été remplie par l'utilitaire de chargement ou créée avec l'option NOT LOGGED INITIALLY, la table sera marquée comme non disponible. La table sera supprimée par l'utilitaire de récupération aval s'il rencontre ultérieurement un journal DROP TABLE. Sinon, une fois la base de données récupére, une erreur sera émise si une tentative d'accès à la table est effectuée (SQLSTATE 55019). La seule opération autorisée est la suppression de la table.
- Une fois qu'une telle table est sauvegardée dans le cadre d'une sauvegarde de base de données ou d'espace table, la récupération de la table devient possible.
- Utilisation de tables de requêtes matérialisées pour optimiser le traitement des requêtes: Les différents types de table de requêtes matérialisées utilisent des contrôles différents pour optimiser le traitement des requêtes.
- Une table de requêtes matérialisée REFRESH DEFERRED définie avec ENABLE QUERY OPTIMIZATION peut être utilisée pour optimiser le traitement des requêtes si chacune des conditions suivantes est vraie:
- CURRENT REFRESH AGE a la valeur ANY.
- L'instruction CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION est définie de telle sorte qu'elle inclut le type de table de requêtes matérialisée.
- CURRENT QUERY OPTIMIZATION est défini sur 2 ou une valeur supérieure ou égale à 5.
Remarque: CURRENT REFRESH AGE n'affecte pas le routage des requêtes vers les tables de requêtes matérialisées MAINTAINED BY FEDERATED_TOOL. - Une table ombre définie avec ENABLE QUERY OPTIMIZATION peut être utilisée pour optimiser le traitement des requêtes en fonction d'un seuil de temps d'attente de réplication si chacune des conditions suivantes est vraie:
- CURRENT REFRESH AGE est défini sur une durée autre que zéro ou ANY.
- L'instruction CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION doit contenir uniquement REPLICATION ou ALL.
- CURRENT QUERY OPTIMIZATION est défini sur 2 ou une valeur supérieure ou égale à 5.
l'instruction SET CURRENT REFRESH AGE
. - Une table de requêtes matérialisée REFRESH IMMEDIATE définie avec ENABLE QUERY OPTIMIZATION est toujours considérée pour l'optimisation si CURRENT QUERY OPTIMIZATION est défini sur 2 ou une valeur supérieure ou égale à 5.
- Pour que cette optimisation puisse utiliser une table de requête matérialisée REFRESH DEFERRED table de requêtes matérialisée qui n'est pas gérée par la réplication ou REFRESH IMMEDIATE, l'instruction FULLSELECT doit se conformer à certaines règles en plus de celles déjà décrites :
- L'instruction fullselect ne doit pas inclure de registres spéciaux Ou fonctions intégrées qui dépendent de la valeur d'un registre spécial.
- L'instruction fullselect ne doit pas inclure de variables globales.
- L'instruction fullselect ne doit pas inclure de fonctions qui ne sont pas déterministes.
- Une table de requêtes matérialisée REFRESH DEFERRED définie avec ENABLE QUERY OPTIMIZATION peut être utilisée pour optimiser le traitement des requêtes si chacune des conditions suivantes est vraie:
- Si une table de requêtes matérialisée est définie avec REFRESH IMMEDIATE, ou si une table de transfert est définie avec PROPAGATE IMMEDIATE, il est possible qu'une erreur se produise lors de la tentative d'application de la modification résultant d'une opération d'insertion, d'une mise à jour ou d'une suppression sur une table sous-jacente. L'erreur entraîne l'échec de l'opération d'insertion, de mise à jour ou de suppression sur la table sous-jacente.
- Les tables de requêtes matérialisées ou les tables de transfert ne peuvent pas être utilisées en tant que tables d'exceptions lorsque des contraintes sont vérifiées en bloc, telles que lors des opérations de chargement ou lors de l'exécution de l'instruction SET INTEGRITY.
- Certaines opérations ne peuvent pas être exécutées sur une table référencée par une table de requêtes matérialisée définie avec REFRESH IMMEDIATE, ou définie avec REFRESH DEFERRED avec une table de transfert associée :
- IMPORT REPLACE ne peut pas être utilisé.
- ALTER TABLE NOT LOGGED INITIALLY WITH EMPTY TABLE ne peut pas être exécuté.
- Dans un système fédéré, les pseudonymes pour les sources de données relationnelles ou les tables locales peuvent être utilisés comme tables sous-jacentes pour créer une table de requêtes matérialisée. Les pseudonymes pour les sources de données non relationnelles ne sont pas pris en charge. Lorsqu'un pseudonyme est l'une des tables sous-jacentes, l'option REFRESH DEFERRED doit être utilisée. Les tables de requêtes matérialisées gérées par le système que les pseudonymes de référence ne sont pas prises en charge dans un environnement de base de données partitionnée.
- Remarques sur les colonnes d'iID de début de transaction: Une colonne d'ID de début de transaction contient une valeur null si la colonne autorise les valeurs null, s'il existe une colonne de début de ligne et si la valeur de la colonne est unique parmi les valeurs des colonnes de début de ligne qui sont générées pour d'autres transactions. Etant donné que la colonne peut contenir des valeurs NULL, il est recommandé d'utiliser l'une des méthodes suivantes lors de l'extraction d'une valeur de la colonne:
COALESCE ( transaction_start_id_col, row_begin_col) CASE WHEN transaction_start_id_col IS NOT NULL THEN transaction_start_id_col ELSE row_begin_col END - Définition d'une table temporelle de période système : une définition de table temporelle de période système inclut les éléments suivants :
- Période système nommée SYSTEM_TIME, qui est définie à l'aide d'une colonne de début de ligne et d'une colonne de fin de ligne. Voir les descriptions d'AS ROW BEGIN, AS ROW END et de la définition de période.
- Colonne d'ID de début de transaction. Voir la description de AS TRANSACTION START ID.
- Définition de gestion des versions de données de période système spécifiée dans une instruction ALTER TABLE ultérieure qui spécifie l'action ADD VERSIONING, qui inclut le nom de la table d'historique associée. Voir la description de la clause ADD VERSIONING sous ALTER TABLE.
- Définition d'une table temporelle de période d'application : une définition de table temporelle de période d'application inclut une période d'application nommée BUSINESS_TIME. La période d'application est définie à l'aide d'une colonne d'horodatage de début et d'une colonne de fin. Voir la description de la définition de période.
Les opérations de modification de données sur une table temporelle de période d'application peuvent entraîner une insertion automatique d'une ou deux lignes supplémentaires lorsqu'une ligne est mise à jour ou supprimée. Lorsqu'une mise à jour ou une suppression d'une ligne dans une table temporelle de période d'application est spécifiée pour une partie de la période représentée par cette ligne, la ligne est mise à jour ou supprimée et une ou deux lignes sont automatiquement insérées pour représenter la partie de la ligne qui n'est pas modifiée. De nouvelles valeurs sont générées pour chaque colonne générée dans une table temporelle de période d'application pour chaque ligne qui est automatiquement insérée à la suite d'une opération de mise à jour ou de suppression sur la table. Si une colonne générée est définie comme partie d'une clé unique ou principale, la clé parente d'une contrainte référentielle ou d'un index unique, il est possible qu'une insertion automatique violerait une contrainte ou un index auquel cas une erreur est renvoyée.
- Remarques sur les colonnes masquées implicitement : la création d'une table avec des colonnes masquées implicitement peut avoir une incidence sur le comportement des utilitaires de transfert de données qui fonctionnent avec la table. Lorsqu'une table contient des colonnes masquées implicitement, des utilitaires tels que IMPORT, INGEST et LOAD exigent que vous spécifiez si les données des colonnes masquées sont incluses dans l'opération. Par exemple, cela peut signifier qu'une opération de chargement s'exécute avec succès sur une table sans colonnes masquées, mais échoue lorsqu'elle est exécutée sur une table contenant des colonnes masquées implicitement (SQLCODE SQL2437N). De même, EXPORT requiert que vous spécifiez si les données des colonnes masquées sont incluses dans l'opération.
Les utilitaires de transfert de données doivent utiliser la variable de registre DB2_DMU_DEFAULT ou les modificateurs de type de fichier implicitlyhiddeninclude ou implicitlyhiddenmissing lorsque vous utilisez des tables contenant des colonnes masquées implicitement.
- DDL transparent: Dans un système fédéré, une table de base distante peut être créée, modifiée ou supprimée à l'aide de SQL Db2 . Cette fonction est appelée transparent DDL. Avant qu'une table de base éloignée puisse être créée sur une source de données, le serveur fédéré doit être configuré pour accéder à cette source de données. Cette configuration inclut la création de l'encapsuleur pour la source de données, la fourniture de la définition de serveur pour le serveur sur lequel se trouve la table de base distante et la création des mappages utilisateur entre le serveur fédéré et la source de données.Transparent DDL impose certaines limitations à ce qui peut être inclus dans l'instruction CREATE TABLE:
- Seules les colonnes et une clé primaire peuvent être créées sur la table de base distante.
- Les clauses spécifiques prises en charge par le langage DDL transparent sont les suivantes :
- Définition de colonne et contrainte unique dans la clause element-list
- NOT NULL et PRIMARY KEY dans la clause column-options
- OPTIONS
- La source de données distante doit prendre en charge:
- Types de données de colonne distante auxquels les types de données de colonne de base de données sont mappés
- Option de clé primaire dans l'instruction CREATE TABLE
Lorsqu'une table de base distante est créée à l'aide de transparent DDL, un pseudonyme est automatiquement créé pour cette table de base distante.
- Une contrainte référentielle peut être définie de telle sorte que la table parent ou la table dépendante fasse partie d'une hiérarchie de tables. Dans une telle situation, l'effet de la contrainte référentielle dépend du type de déclaration:
- Pour une instruction INSERT, UPDATE ou DELETE, la contrainte garantit que, pour chaque ligne de la table dépendante (ou l'une de ses sous-tables) ayant une clé externe non null, une ligne existe dans la table parente (ou l'une de ses sous-tables) avec une clé parente correspondante. Cette règle est appliquée à toute action qui affecte une ligne de l'une des tables, quelle que soit la manière dont cette action est lancée.
- Pour une instruction DROP TABLE :
- Si la table supprimée est la table parent ou la table dépendante, la contrainte est supprimée.
- Si une supertable de la table supprimée est la table parent, les lignes de la table supprimée sont considérées comme supprimées de la supertable. La contrainte référentielle est vérifiée et sa règle de suppression est appelée pour chacune des lignes supprimées.
- Si une supertable de la table supprimée est la table dépendante, la contrainte n'est pas vérifiée. La suppression d'une ligne d'une table dépendante ne peut pas entraîner de violation d'une contrainte référentielle.
- Privilèges : lorsqu'une table est créée, l'utilisateur qui a défini la table reçoit le privilège CONTROL. Lorsqu'une sous-table est créée, le privilège SELECT que chaque utilisateur ou groupe a sur la supertable immédiate est automatiquement accordé sur la sous-table avec la table définie en tant donneur d'autorisation.
- Limite de taille des lignes : le nombre maximal d'octets autorisé dans une ligne d'un tableau organisé en lignes dépend de la taille de la page de l'espace tableau dans lequel le tableau est créé (nom de l'espace tableau). Le tableau suivant indique la limite de taille de ligne et le nombre maximal de colonnes associé à chaque taille de page d'espace table.
Tableau 3. Limites du nombre de colonnes et de la taille de ligne dans chaque taille de page d'espace table (tablesorganisées par lignes ) Taille de page Limite de taille de ligne Limite de nombre de colonnes 4K 4005 500 8K 8 101 1 012 16K 16 293 1 012 32K 32 677 2048 Le nombre réel de colonnes d'une table organisée par lignes peut être encore limité par la formule suivante:Total Columns * 8 + Number of LOB Columns * 12 <= Row Size Limit for Page SizeUn tableau organisé en colonnes peut comporter un maximum de 2048 colonnes, quelle que soit la taille de la page, et le nombre d'octets de toutes les colonnes, y compris les frais généraux, ne doit pas être supérieur à 1 048 319.
- Nombre d'octets : le tableau suivant contient le nombre d'octets des colonnes par type de données. Cette valeur est utilisée pour calculer la taille de ligne. Le nombre d'octets dépend de la question de savoir si la fonction VALUE COMPRESSION est active. Lorsque VALUE COMPRESSION n'est pas active, le nombre d'octets dépend également de l'annulation de la colonne. Les nombres d'octets affichés s'appliquent lorsque la compression de ligne n'est pas activée. Si la compression de ligne est active, le nombre total d'octets utilisés par une ligne sera généralement plus petit que pour une version non compressée de la ligne ; il ne sera jamais plus grand.
Si une table est basée sur un type structuré, 4 octets supplémentaires de temps système sont réservés pour identifier les lignes de sous-tables, que les sous-tables soient définies ou non. Les colonnes de sous-table supplémentaires doivent être considérées comme pouvant prendre une valeur null pour le nombre d'octets, même si elles sont définies comme pouvant prendre une valeur null.
Tableau 4. Nombre d'octets de colonnes par type de données Type de données VALUE COMPRESSION est actif1 VALUE COMPRESSION is not active La colonne peut prendre une valeur null La colonne ne peut pas prendre une valeur null SMALLINT 4 3 2 INTEGER 6 5 4 BIGINT 10 9 8 REAL 6 5 4 DOUBLE 10 9 8 DECIMAL Intégrale de (p/2)+3, où p représente la précision Intégrale de (p/2)+ 2, où p représente la précision Intégrale de (p/2)+1, où p représente la précision DECFLOAT (16) 10 9 8 DECFLOAT (34) 18 17 16 CHAR(n) n+ 2 n+ 1 n VARCHAR(n) n+ 2 n+5 (dans une table) n+4 (dans une table) LONG VARCHAR2 22 25 24 BINARY n+ 2 n+ 1 n VARBINARY n+ 2 n+5 (dans une table) n+4 (dans une table) GRAPHIC(n) n* 2 + 2 n* 2 + 1 n* 2 VARGRAPHIC(n) n* 2 + 2 n*2+5 (dans une table) n*2+4 (dans une table) LONG VARGRAPHIC2 22 25 24 DATE 6 5 4 PÉRIODE 5 4 3 TIMESTAMP(p) Intégrale de (p+1)/2+9, où p représente la précision des secondes fractionnelles Intégrale de (p+1)/2+8, où p représente la précision des secondes fractionnelles Intégrale de (P+1)/2+7, où p représente la précision des secondes fractionnelles BOOLEAN 3 2 1 XML (sans INLINE LENGTH spécifié) 82 85 84 XML (avec INLINE LENGTH spécifié) INLINE LENGTH +2 INLINE LENGTH +4 INLINE LENGTH +3 Nombre maximal d'objets LOB 3 longueur 1024 (sans INLINE LENGTH spécifié) 70 73 72 Longueur maximale de l'objet LOB 8192 (sans INLINE LENGTH spécifié) 94 97 96 Longueur maximale de l'objet LOB 65 536 (sans INLINE LENGTH spécifié) 118 121 120 Longueur maximale d'objet LOB 524,000 (sans INLINE LENGTH spécifié) 142 145 144 Longueur maximale de l'objet LOB 4 190 000 (sans INLINE LENGTH spécifié) 166 169 168 Longueur maximale de l'objet LOB 134,000,000 (sans INLINE LENGTH spécifié) 198 201 200 Longueur maximale du LOB 536 000 000 (sans INLINE LENGTH spécifié) 222 225 224 Longueur maximale de l'objet LOB 1 070 000 000 (sans INLINE LENGTH spécifié) 254 257 256 Longueur maximale de l'objet LOB 1 470 000 000 (sans INLINE LENGTH spécifié) 278 281 280 Longueur maximale de l'objet LOB 2 147 483 647 (sans INLINE LENGTH spécifié) 314 317 316 LOB avec INLINE LENGTH spécifié INLINE LENGTH + 2 INLINE LENGTH + 5 INLINE LENGTH + 4 1 2 octets de mémoire supplémentaires sont utilisés par chaque ligne lorsque VALUE COMPRESSION est actif pour la ligne.
2Les types de données LONG VARCHAR et LONG VARGRAPHIC sont obsolètes et seront peut-être supprimés dans une édition ultérieure.
3 Chaque valeur LOB a un descripteur LOB dans l'enregistrement de base qui pointe vers l'emplacement de la valeur réelle. La taille du descripteur varie en fonction de la longueur maximale définie pour la colonne. Lorsque INLINE LENGTH n'est pas spécifié pour une colonne LOB, la taille du descripteur est utilisée comme valeur de longueur en ligne par défaut.
Lors de la détermination du nombre d'octets pour les colonnes LOB, il existe des octets supplémentaires à prendre en compte lorsqu'une colonne LOB fait partie d'une table temporaire système qui peut être générée pour les curseurs insensibles, les curseurs flottants et les autres requêtes nécessitant un espace temporaire ou un tri des données. Le nombre d'octets supplémentaires requis peut aller jusqu'à 70 octets, selon la requête spécifique. Si la table de base est proche de la longueur de ligne maximale de la page pagesize, une erreur peut être renvoyée lors du traitement d'une requête si la table temporaire du système ne peut pas être dans le plus grand espace table temporaire du système disponible. Si un espace table temporaire système existant est disponible avec une taille de page 32K , le support de taille de ligne étendue est utilisé dans la mesure du possible.
Pour un type distinct, le nombre d'octets correspond à la longueur du type de source du type distinct. Pour un type de référence, le nombre d'octets correspond à la longueur du type de données intégré sur lequel le type de référence est basé. Pour un type structuré, le nombre d'octets correspond à INLINE LENGTH + 4. INLINE LENGTH est la valeur spécifiée (ou calculée implicitement) pour la colonne de la clause column-options.
Les tailles de ligne des exemples de tables suivants supposent que VALUE COMPRESSION n'est pas spécifiée:
Si la fonction VALUE COMPRESSION devait être spécifiée, la taille des lignes changerait pour :DEPARTMENT 63 (0 + 3 + 33 + 7 + 3 + 17) ORG 57 (0 + 3 + 19 + 2 + 15 + 18)DEPARTMENT 69 (2 + 5 + 31 + 8 + 5 + 18) ORG 53 (2 + 4 + 16 + 4 + 12 + 15)Taille de page minimale requise pour une table avec une taille de ligne étendue : Lorsqu'une ligne de données est insérée ou mise à jour dans une table avec prise en charge de la taille de ligne étendue et que la longueur de ligne de données physiques dépasse la longueur d'enregistrement maximale de l'espace table, un sous-ensemble des colonnes de chaîne de longueur variable (VARCHAR ou VARGRAPHIC) est stocké en tant que données LOB en dehors de la ligne de données. La colonne de table de la ligne de base est remplacée par un descripteur de 24 octets. Afin d'accommoder le cas extrême où toutes les données VARCHAR ou VARGRAPHIC sont stockées en dehors de la ligne de données, le gestionnaire de base de données calcule la taille de ligne minimale à l'aide de la méthode suivante:- Gère toutes les colonnes VARCHAR (n) où n > 24 comme si elles étaient VARCHAR (24)
- Gère toutes les colonnes VARGRAPHIC (m) où m > 12 comme s'il s'agissait de VARGRAPHIC (12
- Nombre d'octets de stockage : les tableaux suivants décrivent le nombre d'octets de stockage des colonnes par type de données pour les valeurs de données.
La première table définit les ensembles d'attributs. Ces attributs sont référencés dans la seconde table, qui contient les détails du nombre d'octets pour chaque type de données.
Le nombre d'octets dépend de la question de savoir si la fonction VALUE COMPRESSION est active. Lorsque VALUE COMPRESSION n'est pas active, le nombre d'octets dépend également de l'annulation de la colonne. Les valeurs de la table représentent la quantité de stockage (en octets) utilisée pour stocker la valeur. Les nombres d'octets affichés s'appliquent lorsque la compression de ligne n'est pas activée. Si la compression de ligne est active, le nombre total d'octets utilisés par une ligne sera généralement plus petit que pour une version non compressée de la ligne ; il ne sera jamais plus grand.
Tableau 5. Définitions des critères référencés dans la table associée Cas Valeur de données VALUE COMPRESSION Acceptabilité des valeurs indéfinies (NULL) des colonnes A NULL Inactif NULL admis B NULL Actif 2 NULL admis C Longueur zéro Actif 2 Non applicable D Valeur par défaut du système1 Actif 2 Non applicable E Toutes les autres valeurs de données Inactif NULL admis F Toutes les autres valeurs de données Inactif Non nullable G Toutes les autres valeurs de données Actif 2 Non applicable 1 Lorsque le paramètre COMPRESS SYSTEM DEFAULT est spécifié pour la colonne.
2 2 octets de mémoire supplémentaires sont utilisés par chaque ligne lorsque VALUE COMPRESSION est actif pour la ligne.
Tableau 6. Nombre d'octets de stockage basés sur le format de ligne, le type de données et la valeur de données Type de données Cas A Cas B Cas C Cas D Cas E Cas F Cas G SMALLINT 3 3 - 3 3 2 4 INTEGER 5 3 - 3 5 4 6 BIGINT 9 3 - 3 9 8 10 REAL 5 3 - 3 5 4 6 DOUBLE 9 3 - 3 9 8 10 DECIMAL Intégrale de (p/2)+ 2, où p représente la précision 3 - 3 Intégrale de (p/2)+ 2, où p représente la précision Intégrale de (p/2)+1, où p représente la précision Intégrale de (p/2)+3, où p représente la précision DECFLOAT (16) 9 3 - 3 9 8 10 DECFLOAT (34) 17 3 - 3 17 16 18 CHAR(n) n+ 1 3 - 3 n+ 1 n n+ 2 VARCHAR(n) 5 3 2 2 N+5, où N représente le nombre d'octets des données N+4, où N représente le nombre d'octets des données N+2, où N représente le nombre d'octets des données LONG VARCHAR2 5 3 2 2 25 24 22 BINARY n+ 1 3 - 3 n+ 1 n n+ 2 VARBINARY 5 3 2 2 N+5, où N représente le nombre d'octets des données N+4, où N représente le nombre d'octets des données N+2, où N représente le nombre d'octets des données GRAPHIC(n) n* 2 + 1 3 - 3 n* 2 + 1 n* 2 n* 2 + 2 VARGRAPHIC(n) 5 3 2 2 N*2+5, où N représente le nombre d'octets des données N*2+4, où N représente le nombre d'octets des données N*2+2, où N représente le nombre d'octets des données LONG VARGRAPHIC2 5 3 2 2 25 24 22 DATE 5 3 - - 5 4 6 PÉRIODE 4 3 - - 4 3 5 TIMESTAMP(p) Intégrale de (p+1)/2+8, où p représente la précision des secondes fractionnelles 3 - - Intégrale de (p+1)/2+8, où p représente la précision des secondes fractionnelles Intégrale de (P+1)/2 + 7, où P est la précision des fractions de secondes Intégrale de (p+1)/2+9, où p représente la précision des secondes fractionnelles BOOLEAN 2 2 - 2 2 1 3 Nombre maximal d'objets LOB 1 longueur 1024 5 3 2 2 (60 à 68)+5 (60 à 68)+4 (60 à 68)+2 Longueur maximale de l'objet LOB 8192 5 3 2 2 (60 à 92)+5 (60 à 92)+4 (60 à 92)+2 Longueur maximale de l'objet LOB 65 536 5 3 2 2 (60 à 116)+5 (60 à 116)+4 (60 à 116)+2 Longueur maximale de l'objet LOB 524 000 5 3 2 2 (60 à 140)+5 (60 à 140)+4 (60 à 140)+2 Longueur maximale de l'objet LOB 4 190 000 5 3 2 2 (60 à 164)+5 (60 à 164)+4 (60 à 164)+2 Longueur maximale de l'objet LOB 134 000 000 5 3 2 2 (60 à 196)+5 (60 à 196)+4 (60 à 196)+2 Longueur maximale LOB 536 000 000 5 3 2 2 (60 à 220)+5 (60 à 220)+4 (60 à 220)+2 Longueur maximale de l'objet LOB 1 070 000 000 5 3 2 2 (60 à 252)+5 (60 à 252)+4 (60 à 252)+2 Longueur maximale de l'objet LOB 1 470 000 000 5 3 2 2 (60 à 276)+5 (60 à 276)+4 (60 à 276)+2 Longueur maximale de l'objet LOB 2 147 483 647 5 3 2 2 (60 à 312)+5 (60 à 312)+4 (60 à 312)+2 langage XML 5 3 - - 85 84 82 1 Lorsque le paramètre COMPRESS SYSTEM DEFAULT est spécifié pour la colonne.
2 Les types de données LONG VARCHAR et LONG VARGRAPHIC sont obsolètes et pourraient être supprimés dans une édition ultérieure.
- Colonnes de dimension : comme chaque valeur distincte d'une colonne de dimension est affectée à un autre bloc de la table, le groupement sur une expression peut être souhaitable, par exemple,
ENTIER (ORDER_DATE)/100
. Dans ce cas, une colonne générée peut être définie pour la table, et cette colonne générée peut ensuite être utilisée dans la clause ORGANIZE BY DIMENSIONS. Si l'expression est monotone par rapport à une colonne de la table, la base de données peut utiliser l'index de dimension pour satisfaire les prédicats de plage de cette colonne. Par exemple, si l'expression est simplement column-name + some-positive-constant, il s'agit d'une augmentation monotone. Les fonctions définies par l'utilisateur, certaines fonctions intégrées et l'utilisation de plusieurs colonnes dans une expression empêchent la monotonicité ou sa détection.Les dimensions impliquant des colonnes générées dont les expressions sont non-monotones ou dont la monotonicité ne peut pas être déterminée peuvent toujours être créées, mais les requêtes de plage le long des limites de tranche ou de cellule de ces dimensions ne sont pas prises en charge. L'égalité et les prédicats IN peuvent traités par des tranches ou des cellules.
Une colonne générée est monotone si ce qui suit est vrai en ce qui concerne la fonction génératrice, fn :
- Monotone croissant..Pour chaque paire de valeurs possible x1 et x2, si x2>x1, fn (x2)>fn(x1). Exemple :
SALARY - 10000 - Monotone décroissant.Pour chaque paire de valeurs possible x1 et x2, si x2>x1, puis fn(x2)<fn (x1). Exemple :
-SALARY - Monotone non décroissant.Pour chaque paire de valeurs possible x1 et x2, si x2>x1, puis fn (x2)>=fn(x1). Exemple :
SALARY/1000 - Monotone non croissant.Pour chaque paire de valeurs possible x1 et x2, si x2>x1, puis fn(x2)<=fn(x1). Exemple :
-SALARY/1000
L'expression
PRICE*DISCOUNT
n'est pas monotone, car elle implique plusieurs colonnes de la table. - Monotone croissant..
- Tables groupées par plage : l'organisation d'une table par séquence de clés est effective pour certains types de tables. La table doit avoir une clé de type entier qui est étroitement groupée (dense) sur la plage de valeurs possibles. Les colonnes de cette clé de type entier ne doivent pas prendre de valeur null, et la clé doit logiquement être la clé primaire de la table. L'organisation d'une table groupée par plage exclut le besoin d'un objet d'index unique distinct, fournissant un accès direct à la ligne pour une valeur de clé spécifiée, ou une plage de lignes pour une plage de valeurs de clé spécifiée. L'allocation de tout l'espace pour l'ensemble des lignes de la séquence de clés définie est effectuée lors de la création de la table et doit être prise en compte lors de la définition d'une table à intervalles. L'espace de stockage n'est pas disponible pour toute autre utilisation, même si les lignes sont initialement marquées comme supprimées. Si la plage de séquence de clés complète ne contient des données que sur une longue période, cette organisation de table peut ne pas être appropriée.
- Une table peut disposer d'au moins une règle de sécurité.
- Les contraintes d'intégrité référentielle définies sur les tables protégées sont appliquées. Les violations de contraintes dans ce cas peuvent être difficiles à déboguer, car le gestionnaire de base de données ne vous permet pas de voir quelle ligne a provoqué une violation si vous ne disposez pas de l'étiquette de sécurité appropriée ou des droits d'accès aux exemptions.
- Lors de la définition de l'ordre des colonnes dans une table, les colonnes fréquemment mises à jour doivent être placées à la fin de la définition pour réduire la quantité de données consignées pour les mises à jour. Cela inclut les colonnes ROW CHANGE TIMESTAMP. Les colonnes ROW CHANGE TIMESTAMP sont garanties pour être mises à jour sur chaque mise à jour de ligne.
- Sécurité et réplication : la réplication peut entraîner la réplication des lignes de données à partir d'une table protégée en dehors de la base de données. Des soins doivent être pris lors de la configuration de la réplication pour une table protégée, car les données qui se trouvent en dehors de la base de données ne peuvent pas être protégées.
- Remarques relatives à un environnement Db2 pureScale multipartition:
- Si les options CACHE et NO ORDER sont en vigueur, plusieurs caches peuvent être actives simultanément. Cela peut se produire au niveau de chaque membre dans un environnement ou Db2 pureScale multipartition. Les demandes d'affectations de valeurs suivantes provenant de différents membres peuvent ne pas aboutir à l'affectation de valeurs dans un ordre numérique strict. Supposons, par exemple, que dans un environnement ou Db2 pureScale multipartition, les membres DB1A et DB1B utilisent la même séquence et que DB1A obtient les valeurs de cache comprises entre 1 et 20 et DB1B les valeurs de cache comprises entre 21 et 40. Dans ce scénario, si DB1A a demandé la valeur suivante en premier, puis DB1B l'a demandée, puis DB1A l'a redemandée, l'ordre réel des valeurs affectées est 1,21,2. Par conséquent, pour garantir que les numéros de séquence sont générés dans un ordre numérique strict entre plusieurs membres utilisant la même séquence simultanément, spécifiez l'option ORDER.
- Dans un environnement Db2 pureScale, l'utilisation de l'option ORDER ou NO CACHE garantit que les valeurs affectées à une séquence qui est partagée par les applications sur plusieurs membres sont dans un ordre numérique strict. Dans un environnement Db2 pureScale, si ORDER est spécifié, NO CACHE est implicite même si CACHE n est spécifié
- Considérations relatives au contrôle d'accès aux lignes et aux colonnes (RCAC): les clauses ACTIVATE ROW ACCESS CONTROL, ACTIVATE COLUMN ACCESS CONTROL, DEACTIVATE ROW ACCESS CONTROL et DEACTIVATE COLUMN ACCESS CONTROL ne sont pas prises en charge. Utilisez l'instruction ALTER TABLE pour activer ou désactiver le contrôle d'accès de niveau des lignes ou des colonne sur une table.
- Remarques relatives aux tables organisées par colonnes : Créez des tables organisées par colonnes dans les espaces de table de stockage automatique uniquement.Les options suivantes ne sont pas prises en charge pour les tables organisées par colonnes (les options soulignées sont les valeurs par défaut). Ils peuvent toutefois être spécifiés pour les tables organisées par lignes qui seront utilisées dans la même base de données et les mêmes charges de travail que les tables organisées par colonnes .
- ORGANIZE BY {DIMENSIONS | KEY SEQUENCE | INSERT TIME}
- DATA CAPTURE CHANGES
- VALUE COMPRESSION
- COMPRESS YES [ADAPTIVE | STATIC ]
- COMPRESS NO
- Partitionner par plage
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- CREATE TABLE OF <type-name1> (pour créer une table basée sur un type structuré)
- PROPAGATE IMMEDIATE
- CHECK
- DETERMINED BY
Les colonnes de type structuré ne sont pas prises en charge.
Les colonnes d'une table organisée par colonnes doivent avoir l'un des types de données suivants:- SMALLINT
- INTEGER
- BIGINT
- DECIMAL
- REAL
- DOUBLE
- DECFLOAT
- CHAR (y compris FOR BIT DATA)
- VARCHAR (y compris FOR BIT DATA)
- BINARY
- VARBINARY
- GRAPHIC
- VARGRAPHIC
- DATE
- PÉRIODE
- TIMESTAMP (n)
- BOOLEAN
- CLOB
- BLOB
- DBCLOB
- NCLOB
- Types distincts d'un type de données pris en charge
Alternatives de syntaxe
- La syntaxe suivante est acceptée comme comportement par défaut:
- IN database-name.tablespace-name
- IN DATABASE database-name
- Pour données mixtes
- Pour données SBCS
- PART peut être spécifié à la place de PARTITION.
- PARTITION partition-number peut être spécifié à la place de PARTITION partition-name. Un numéro-partition ne doit pas identifier une partition précédemment spécifiée dans l'instruction CREATE TABLE. Si aucun numéro de partition n'est spécifié, un numéro de partition unique est généré par le gestionnaire de base de données.
- VALEURS peut être indiqué à la place de ENDING AT.
- Le mot clé CONSTRAINT peut être omis d'une définition de colonne définissant une clause de référence.
- Le nom de contrainte peut être spécifié après FOREIGN KEY (sans le mot clé CONSTRAINT).
- SUMMARY peut éventuellement être spécifié après CREATE.
- DEFINITION SEULEMENT peut être spécifié à la place de WITH NO DATA.
- PARTITIONING KEY peut être spécifié à la place de DISTRIBUTE BY.
- DISTRIBUTE ON peut être spécifié à la place de DISTRIBUTE BY lorsqu'il est suivi par l'option HASH et qu'il est suivi de l'option REPLICATION.
- REPLICATED peut être spécifié à la place de DISTRIBUTE PAR REPLICATION
- Une virgule peut être utilisée pour séparer plusieurs options dans la clause identity-options.
- NOMINVALUE, NOMAXVALUE, NOCYCLE, NOCACHE et NOORDER peuvent être spécifiés à la place de NO MINVALUE, NO MAXVALUE, NO CYCLE, NO CACHE et NO ORDER, respectivement.
- ADD peut être spécifié avant table-option-name string-constant.
- Lorsque vous spécifiez la valeur du registre spécial de date et heure, NOW() peut être spécifié à la place de CURRENT_TIMESTAMP.
Exemples
- Créez la table TDEPT dans l'espace table DEPARTX. DEPTNO, DEPTNAME, MGRNO et ADMRDEPT sont des noms de colonne. CHAR signifie que la colonne contient des données de type caractère. NOT NULL signifie que la colonne ne peut pas contenir de valeur null. VARCHAR signifie que la colonne contiendra des données de caractères de longueur variable. La clé primaire se compose de la colonne DEPTNO.
CREATE TABLE TDEPT (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6), ADMRDEPT CHAR(3) NOT NULL, PRIMARY KEY(DEPTNO)) IN DEPARTX - Créez la table PROJ dans l'espace table SCHED. PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTAFF, PRSTDATE, PRENDATE et MAJPROJ sont des noms de colonne. CHAR signifie que la colonne contient des données de type caractère. DECIMAL signifie que la colonne contiendra des données décimales condensées. 5.2 signifie ce qui suit : 5 indique le nombre de chiffres décimaux et 2 indique le nombre de chiffres à droite du séparateur décimal. NOT NULL signifie que la colonne ne peut pas contenir de valeur null. VARCHAR signifie que la colonne contiendra des données de caractères de longueur variable. DATE signifie que la colonne contiendra les informations de date en trois parties (année, mois et jour).
CREATE TABLE PROJ (PROJNO CHAR(6) NOT NULL, PROJNAME VARCHAR(24) NOT NULL, DEPTNO CHAR(3) NOT NULL, RESPEMP CHAR(6) NOT NULL, PRSTAFF DECIMAL(5,2) , PRSTDATE DATE , PRENDATE DATE , MAJPROJ CHAR(6) NOT NULL) IN SCHED - Créez une table appelée EMPLOYEE_SALARY où un salaire inconnu est considéré 0. Aucun espace table n'est spécifié, de sorte que la table soit créée dans un espace table sélectionné par le système en fonction des règles décrites pour la clause IN tablespace-name.
CREATE TABLE EMPLOYEE_SALARY (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, EMPNO CHAR(6) NOT NULL, SALARY DECIMAL(9,2) NOT NULL WITH DEFAULT) - Créez des types distincts pour le salaire total et les miles et utilisez-les pour les colonnes d'une table créée dans l'espace table par défaut. Dans une instruction SQL dynamique, le registre spécial CURRENT SCHEMA est JOHNDOE et CURRENT PATH est la valeur par défaut (
SYSIBM
,SYSFUN
,JOHNDOE
).Si une valeur pour SALARY n'est pas spécifiée, elle doit être 0 et si une valeur pour LIVING_DIST n'est pas spécifiée, elle doit être définie sur 1 mile.CREATE TYPE JOHNDOE.T_SALARY AS INTEGER CREATE TYPE JOHNDOE.MILES AS FLOAT CREATE TABLE EMPLOYEE (ID INTEGER NOT NULL, NAME CHAR (30), SALARY T_SALARY NOT NULL WITH DEFAULT, LIVING_DIST MILES DEFAULT MILES(1) ) - Créez des types distincts pour l'image et l'audio et utilisez-les pour les colonnes d'une table. Aucun espace table n'est spécifié, de sorte que la table soit créée dans un espace table sélectionné par le système en fonction des règles décrites pour la clause IN tablespace-name. Supposons que CURRENT PATH soit la valeur par défaut.
CREATE TYPE IMAGE AS BLOB (10M) CREATE TYPE AUDIO AS BLOB (1G) CREATE TABLE PERSON (SSN INTEGER NOT NULL, NAME CHAR (30), VOICE AUDIO, PHOTO IMAGE) - Créez une table EMPLOYEE dans l'espace table HUMRES. Les contraintes définies dans la table sont les suivantes :
- Les valeurs du numéro de service doivent être comprises entre 10 et 100.
- Le travail d'un employé ne peut être que
Sales
,Mgr
ouClerck
. - Tout employé qui travaille avec l'entreprise depuis 1986 doit faire plus de 40 500 USD.
Remarque: Si les colonnes incluses dans les contraintes de vérification sont nullables, elles peuvent également être NULL.CREATE TABLE EMPLOYEE (ID SMALLINT NOT NULL, NAME VARCHAR(9), DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100), JOB CHAR(5) CHECK (JOB IN ('Sales','Mgr','Clerk')), HIREDATE DATE, SALARY DECIMAL(7,2), COMM DECIMAL(7,2), PRIMARY KEY (ID), CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) > 1986 OR SALARY > 40500) ) IN HUMRES - Créez une table entièrement contenue dans l'espace table PAYROLL.
CREATE TABLE EMPLOYEE ..... IN PAYROLL - Créez une table avec sa partie de données dans ACCOUNTING et son élément d'index dans ACCOUNT_IDX.
CREATE TABLE SALARY..... IN ACCOUNTING INDEX IN ACCOUNT_IDX - Créez une table et consigner les modifications SQL dans le format par défaut.
ouCREATE TABLE SALARY1 .....CREATE TABLE SALARY1 ..... DATA CAPTURE NONE - Créez une table et consigner les modifications SQL dans un format étendu.
CREATE TABLE SALARY2 ..... DATA CAPTURE CHANGES - Créez une table EMP_ACT dans l'espace table SCHED. EMPNO, PROJNO, ACTNO, EMPTIME, EMSTDATE et EMENDATE sont des noms de colonne. Les contraintes définies dans la tablesont les suivantes :
- La valeur de l'ensemble de colonnes, EMPNO, PROJNO et ACTNO, dans une ligne, doit être unique.
- La valeur de PROJNO doit correspondre à une valeur existante pour la colonne PROJNO de la table PROJECT et si le projet est supprimé, toutes les lignes faisant référence au projet dans EMP_ACT doivent également être supprimées.
Un index unique appelé EMP_ACT_UNIQ est automatiquement créé dans le même schéma pour appliquer la contrainte unique.CREATE TABLE EMP_ACT (EMPNO CHAR(6) NOT NULL, PROJNO CHAR(6) NOT NULL, ACTNO SMALLINT NOT NULL, EMPTIME DECIMAL(5,2), EMSTDATE DATE, EMENDATE DATE, CONSTRAINT EMP_ACT_UNIQ UNIQUE (EMPNO,PROJNO,ACTNO), CONSTRAINT FK_ACT_PROJ FOREIGN KEY (PROJNO) REFERENCES PROJECT (PROJNO) ON DELETE CASCADE ) IN SCHED - Créez une table qui doit contenir des informations sur les buts célèbres pour le hall d'honneur du hockey sur glace. La table répertorie les informations sur le joueur qui a marqué le but, le gardien de but contre qui il a été marqué, la date et une description. La colonne de description admet les valeurs null.
CREATE TABLE HOCKEY_GOALS ( BY_PLAYER VARCHAR(30) NOT NULL, BY_TEAM VARCHAR(30) NOT NULL, AGAINST_PLAYER VARCHAR(30) NOT NULL, AGAINST_TEAM VARCHAR(30) NOT NULL, DATE_OF_GOAL DATE NOT NULL, DESCRIPTION CLOB(5000) ) - Supposons qu'une table d'exceptions est nécessaire pour la table EMPLOYEE. On peut en créer une à l'aide de l'instruction suivante.
CREATE TABLE EXCEPTION_EMPLOYEE AS (SELECT EMPLOYEE.*, CURRENT TIMESTAMP AS TIMESTAMP, CAST ('' AS CLOB(32K)) AS MSG FROM EMPLOYEE ) WITH NO DATA - Compte tenu des espaces table suivants avec les attributs indiqués :
TBSPACE PAGESIZE USER USERAUTH ------------------ ----------- ------ -------- DEPT4K 4096 BOBBY Y PUBLIC4K 4096 PUBLIC Y DEPT8K 8192 BOBBY Y DEPT8K 8192 RICK Y PUBLIC8K 8192 PUBLIC Y- Si RICK crée la table suivante, il est placé dans l'espace table PUBLIC4K, car le nombre d'octets est inférieur à 4005, mais si BOBBY crée la même table, il est placé dans l'espace table DEPT4K, car BOBBY a le privilège USE en raison d'un octroi explicite :
CREATE TABLE DOCUMENTS (SUMMARY VARCHAR(1000), REPORT VARCHAR(2000)) - Si BOBBY crée la table suivante, il est placé dans l'espace table DEPT8K, car le nombre d'octets est supérieur à 4005, et BOBBY a le privilège USE en raison d'un octroi explicite. Toutefois, si DUNCAN crée la même table, elle est placée dans l'espace table PUBLIC8K, car DUNCAN n'a pas de privilèges spécifiques :
CREATE TABLE CURRICULUM (SUMMARY VARCHAR(1000), REPORT VARCHAR(2000), EXERCISES VARCHAR(1500))
- Si RICK crée la table suivante, il est placé dans l'espace table PUBLIC4K, car le nombre d'octets est inférieur à 4005, mais si BOBBY crée la même table, il est placé dans l'espace table DEPT4K, car BOBBY a le privilège USE en raison d'un octroi explicite :
- Créez une table avec une colonne LEAD définie avec le type structuré EMP. Indiquez une valeur INLINE LENGTH de 300 octets pour la colonne LEAD, indiquant que toutes les instances de LEAD qui ne peuvent pas s'insérer dans les 300 octets sont stockées à l'extérieur de la table (séparément de la ligne de la table de base, similaire à la façon dont les valeurs LOB sont gérées).
CREATE TABLE PROJECTS (PID INTEGER, LEAD EMP INLINE LENGTH 300, STARTDATE DATE, ...) - Créez une table DEPT avec cinq colonnes nommées DEPTNO, DEPTNAME, MGRNO, ADMRDEPT et LOCATION. La colonne DEPT doit être définie comme une colonne IDENTITY afin qu'une valeur soit toujours générée pour elle. Les valeurs de la colonne DEPT doivent commencer par 500 et incrémenter de 1.
CREATE TABLE DEPT (DEPTNO SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 500, INCREMENT BY 1), DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6), ADMRDEPT SMALLINT NOT NULL, LOCATION CHAR(30)) - Créez une table SALES qui est distribuée dans la colonne YEAR et qui comporte des dimensions sur les colonnes REGION et YEAR. Les données seront réparties entre les partitions de base de données en fonction des valeurs hachées de la colonne YEAR. Sur chaque partition de base de données, les données seront organisées en extensions basées sur des combinaisons uniques de valeurs des colonnes REGION et YEAR sur ces partitions de base de données.
CREATE TABLE SALES (CUSTOMER VARCHAR(80), REGION CHAR(5), YEAR INTEGER) DISTRIBUTE BY HASH (YEAR) ORGANIZE BY DIMENSIONS (REGION, YEAR) - Créez une table SALES avec une colonne PURCHASEYEARMONTH générée à partir de la colonne PURCHASEDATE. Utilisez une expression pour créer une colonne monotone par rapport à la colonne PURCHASEDATE d'origine ; elle peut donc être utilisée en tant que dimension. La table est distribuée dans la colonne REGION et organisée dans chaque partition de base de données en extensions en fonction de la colonne PURCHASEYEARMONTH, c'est-à-dire que différentes régions se trouvent sur des partitions de base de données différentes et que les différents mois d'achat appartiennent à différentes cellules (ou ensembles de domaines) dans ces partitions de base de données.
CREATE TABLE SALES (CUSTOMER VARCHAR(80), REGION CHAR(5), PURCHASEDATE DATE, PURCHASEYEARMONTH INTEGER GENERATED ALWAYS AS (INTEGER(PURCHASEDATE)/100)) DISTRIBUTE BY HASH (REGION) ORGANIZE BY DIMENSIONS (PURCHASEYEARMONTH) - Créez une table CUSTOMER avec une colonne CUSTOMERNUMDIM générée à partir de la colonne CUSTOMERNUM. Utilisez une expression pour créer une colonne monotone par rapport à la colonne CUSTOMERNUM d'origine ; elle peut donc être utilisée en tant que dimension. La table est organisée en cellules en fonction de la colonne CUSTOMERNUMDIM, de sorte qu'il existe une cellule différente dans la table pour 50 clients. Si un index unique est créé sur CUSTOMERNUM, les numéros de client sont regroupés de telle sorte que chaque ensemble de 50 valeurs se trouve dans un ensemble particulier d'extents dans la table.
CREATE TABLE CUSTOMER (CUSTOMERNUM INTEGER, CUSTOMERNAME VARCHAR(80), ADDRESS VARCHAR(200), CITY VARCHAR(50), COUNTRY VARCHAR(50), CODE VARCHAR(15), CUSTOMERNUMDIM INTEGER GENERATED ALWAYS AS (CUSTOMERNUM/50)) ORGANIZE BY DIMENSIONS (CUSTOMERNUMDIM) - Créez une table de base distante appelée EMPLOYEE sur le serveur Oracle, ORASERVER. Un pseudonyme, appelé EMPLOYEE, qui fait référence à cette table de base distante nouvellement créée, sera également créé automatiquement.
CREATE TABLE EMPLOYEE (EMP_NO CHAR(6) NOT NULL, FIRST_NAME VARCHAR(12) NOT NULL, MID_INT CHAR(1) NOT NULL, LAST_NAME VARCHAR(15) NOT NULL, HIRE_DATE DATE, JOB CHAR(8), SALARY DECIMAL(9,2), PRIMARY KEY (EMP_NO)) OPTIONS (REMOTE_SERVER 'ORASERVER', REMOTE_SCHEMA 'J15USER1', REMOTE_TABNAME 'EMPLOYEE')Les instructions CREATE TABLE suivantes indiquent comment spécifier le nom de la table, ou le nom de la table et le nom de la table de base distante explicite, pour obtenir le cas requis. L'identificateur en minuscules, employee, est utilisé pour illustrer le pliage implicite des identificateurs.
Créez une table de base distante appelée EMPLOYEE (caractères majuscules) sur un serveur Informix® et créez un pseudonyme nommé EMPLOYEE (caractères majuscules) sur cette table:
Si l'option REMOTE_TABNAME n'est pas spécifiée et que le nom de table n'est pas délimité, le nom de la table de base distante sera en majuscules, même si la source de données éloignée stocke normalement des noms en minuscules.CREATE TABLE employee (EMP_NO CHAR(6) NOT NULL, ...) OPTIONS (REMOTE_SERVER 'INFX_SERVER')Créez une table de base distante appelée Employé (caractères minuscules) sur un serveur Informix et créez un pseudonyme nommé EMPLOYEE (caractères majuscules) sur cette table:
Lors de la création d'une table sur une source de données distante prenant en charge les identificateurs délimités, utilisez l'option REMOTE_TABNAME et une constante de chaîne de caractères qui indique le nom de la table dans le cas requis.CREATE TABLE employee (EMP_NO CHAR(6) NOT NULL, ...) OPTIONS (REMOTE_SERVER 'INFX_SERVER', REMOTE_TABNAME 'employee')Créez une table de base distante appelée Employé (caractères minuscules) sur un serveur Informix et créez un pseudonyme nommé Employé (caractères minuscules) sur cette table:
Si l'option REMOTE_TABNAME n'est pas spécifiée et que le nom de table est délimité, le nom de la table de base distante sera identique au nom de table.CREATE TABLE "employee" (EMP_NO CHAR(6) NOT NULL, ...) OPTIONS (REMOTE_SERVER 'INFX_SERVER') - Créez une table groupée par plage qui peut être utilisée pour localiser un étudiant à l'aide d'un ID d'étudiant. Pour chaque dossier d'étudiant, inclure l'ID de l'école, l'ID du programme, le numéro d'étudiant, l'ID étudiant, le prénom de l'élève, le nom de famille de l'élève et la moyenne des étudiants (GPA).
La taille de chaque enregistrement est la somme des colonnes, plus l'alignement, plus l'en-tête de ligne de la table en cluster. Dans ce cas, la taille de ligne est de 98 octets: 4 + 4 + 4 + 4 + 30 + 30 + 8 + 3 (pour les colonnes nullables) + 1 (pour l'alignement) + 10 (pour l'en-tête). Avec une taille de page de 4 Ko (ou 4096 octets), après comptable pour les frais généraux de page, 4 038 octets sont disponibles, suffisamment de place pour 41 enregistrements par page. Pour un million de dossiers d'étudiants, (1 million divisé par 41 dossiers par page) 24 391 pages sont nécessaires. Avec deux pages supplémentaires pour la surcharge de table, le nombre final de pages de 4 Ko allouées lors de la création de la table est de 24 393.CREATE TABLE STUDENTS (SCHOOL_ID INTEGER NOT NULL, PROGRAM_ID INTEGER NOT NULL, STUDENT_NUM INTEGER NOT NULL, STUDENT_ID INTEGER NOT NULL, FIRST_NAME CHAR(30), LAST_NAME CHAR(30), GPA DOUBLE) ORGANIZE BY KEY SEQUENCE (STUDENT_ID STARTING FROM 1 ENDING AT 1000000) DISALLOW OVERFLOW - Créez la table DEPARTMENT avec une dépendance fonctionnelle qui n'a pas de nom de contrainte spécifié.
CREATE TABLE DEPARTMENT (DEPTNO SMALLINT NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6), ADMRDEPT SMALLINT NOT NULL, LOCATION CHAR(30), CHECK (DEPTNAME DETERMINED BY DEPTNO) NOT ENFORCED) - Créez une table avec des lignes protégées.
CREATE TABLE TOASTMASTERS (PERFORMANCE DB2SECURITYLABEL, POINTS INTEGER, NAME VARCHAR(50)) SECURITY POLICY CONTRIBUTIONS - Créez une table avec des colonnes protégées.
CREATE TABLE TOASTMASTERS (PERFORMANCE CHAR(8), POINTS INTEGER COLUMN SECURED WITH CLUBPOSITION, NAME VARCHAR(50)) SECURITY POLICY CONTRIBUTIONS - Créez une table avec des lignes et des colonnes protégées.
CREATE TABLE TOASTMASTERS (PERFORMANCE DB2SECURITYLABEL, POINTS INTEGER COLUMN SECURED WITH CLUBPOSITION, NAME VARCHAR(50)) SECURITY POLICY CONTRIBUTIONS - Les objets LOB d'une table partitionnée résident par défaut dans le même espace table que les données. Ce comportement par défaut peut être remplacé à l'aide de la clause LONG IN pour spécifier un ou plusieurs espaces table pour les objets LOB. Créez la table DOCUMENTS dont les données d'objet LOB doivent être stockées (en mode circulaire pour chaque partition de données) dans les espaces table TBSP1 et TBSP2.
Vous pouvez également utiliser la forme longue de la syntaxe pour identifier explicitement un espace table important pour chaque partition de données. Dans cet exemple, les données CLOB de la première partition de données sont placées dans LARGE_TBSP3, et les données CLOB pour les partitions de données restantes sont réparties entre LARGE_TBSP1 et LARGE_TBSP2 en mode circulaire.CREATE TABLE DOCUMENTS (ID INTEGER, CONTENTS CLOB) LONG IN TBSP1, TBSP2 PARTITION BY RANGE (ID) (STARTING 1 ENDING 1000 EVERY 100)CREATE TABLE DOCUMENTS (ID INTEGER, CONTENTS CLOB) LONG IN LARGE_TBSP1, LARGE_TBSP2 PARTITION BY RANGE (ID) (STARTING 1 ENDING 100 IN TBSP1 LONG IN LARGE_TBSP3, STARTING 101 ENDING 1000 EVERY 100) - Créez une table partitionnée nommée ACCESSNUMBERS avec deux partitions de données. La ligne (10, NULL) doit être placée dans la première partition et la ligne (NULL, 100) doit être placée dans la deuxième (dernière) partition de données.
Etant donné que les valeurs NULL dans la deuxième colonne sont triées en premier, la ligne (11, NULL) est triée sous la limite inférieure de la dernière partition de données (11, 1) ; la tentative d'insertion de cette ligne renvoie une erreur. La ligne (12, NULL) tomberait dans la dernière partition de données.CREATE TABLE ACCESSNUMBERS (AREA INTEGER, EXCHANGE INTEGER) PARTITION BY RANGE (AREA NULLS LAST, EXCHANGE NULLS FIRST) (STARTING (1,1) ENDING (10,100), STARTING (11,1) ENDING (MAXVALUE,MAXVALUE)) - Créez une table nommée RATIO ayant une partition de données unique et une colonne de partitionnement PERCENT.
Cette définition de table permet d'insérer n'importe quelle valeur entière dans la colonne POURCENTAGE. La définition suivante de la table RATIO permet d'insérer une valeur entière comprise entre 1 et 100 inclus dans la colonne PERCENT.CREATE TABLE RATIO (PERCENT INTEGER) PARTITION BY RANGE (PERCENT) (STARTING (MINVALUE) ENDING (MAXVALUE))CREATE TABLE RATIO (PERCENT INTEGER) PARTITION BY RANGE (PERCENT) (STARTING 0 EXCLUSIVE ENDING 100 INCLUSIVE) - Créez une table nommée MYDOCS avec deux colonnes : l'une est un identificateur, et les autres stocke les documents XML.
CREATE TABLE MYDOCS (ID INTEGER, DOC XML) IN HLTBSPACE - Créez une table nommée NOTES avec quatre colonnes, dont une pour le stockage des notes XML.
CREATE TABLE NOTES (ID INTEGER, DESCRIPTION VARCHAR(255), CREATED TIMESTAMP, NOTE XML) - Créez une table, EMP_INFO, qui contient un numéro de téléphone et une adresse pour chaque employé. Incluez une colonne "ROW CHANGE TIMESTAMP" dans le tableau pour suivre la modification des informations sur les employés.
CREATE TABLE EMP_INFO (EMPNO CHAR(6) NOT NULL, EMP_INFOCHANGE TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP, EMP_ADDRESS VARCHAR(300), EMP_PHONENO CHAR(4), PRIMARY KEY (EMPNO) ) - Créez une table partitionnée nommée DOCUMENTS avec deux partitions de données :
- L'objet de données de la première partition réside dans l'espace de table TBSP11. La partition d'index partitionnée de la partition réside dans l'espace table TBSP21. L'objet de données XML réside dans l'espace tableau TBSP31.
- L'objet de données de la seconde partition réside dans l'espace table TBSP12. La partition d'index partitionnée de la partition réside dans l'espace table TBSP22. L'objet de données XML réside dans l'espace tableau TBSP32.
CREATE TABLE DOCUMENTS (ID INTEGER, CONTENTS XML) INDEX IN TBSPX PARTITION BY (ID NULLS LAST) (STARTING FROM 1 INCLUSIVE ENDING AT 100 INCLUSIVE IN TBSP11 INDEX IN TBSP21 LONG IN TBSP31, STARTING FROM 101 INCLUSIVE ENDING AT 200 INCLUSIVE IN TBSP21 INDEX IN TBSP22 LONG IN TBSP32) - Créez une table partitionnée intitulée SALES comportant deux partitions de données :
- L'objet de données de la première partition réside dans l'espace de table TBSP11. La partition d'index partitionnée de la partition réside dans l'espace table TBSP21.
- L'objet de données de la seconde partition réside dans l'espace table TBSP12. L'objet d'index partitionné réside dans l'espace table TBSP22.
CREATE TABLE SALES (SID INTEGER, AMOUNT INTEGER) INDEX IN TBSPX PARTITION BY RANGE (SID NULLS LAST) (STARTING FROM 1 INCLUSIVE ENDING AT 100 INCLUSIVE IN TBSP11 INDEX IN TBSP21, STARTING FROM 101 INCLUSIVE ENDING AT 200 INCLUSIVE IN TBSP12 INDEX IN TBSP22) - Créez une table nommée LIVRES avec quatre colonnes, dont celle nommée DATE_ADDED, qui insère le TIMESTAMP en cours par défaut.
CREATE TABLE BOOKS (ISBN_NUM INTEGER, TITLE VARCHAR(255), AUTHOR VARCHAR(255), DATE_ADDED TIMESTAMP WITH DEFAULT CURRENT TIMESTAMP) - Créez une table Unicode appelée ÉTUDIANTS dans une base de données non Unicode. Supposons que la base de données ait été créée avec le jeu de codes 1252 et le territoire CA et que le paramètre de configuration de la base de données ALT_COLLATE ait été mis à jour à IDENTITY_16BIT.
CREATE TABLE STUDENTS ( STUDENTID INT NOT NULL, FAMILY_NAME VARCHAR(36) NOT NULL, GIVEN_NAME VARCHAR(36) NOT NULL, PRIMARY KEY(STUDENTID)) CCSID UNICODE - Créez une table appelée TDEPT_TEMP, basée sur la table TDEPT créée dans l'exemple 1.
La table TDEPT_TEMP aura la même définition que TDEPT, sauf que la clé primaire ne sera pas définie et qu'un espace table par défaut sera choisi implicitement.CREATE TABLE TDEPT_TEMP LIKE TDEPT - Créer une table de requête matérialisée maintenue par l'utilisateur et organisée en colonnes sur la table organisée en colonnes CDE.TDEPT.
CREATE TABLE mqt_tdept AS (SELECT * FROM cde.tdept WHERE deptno BETWEEN 10 AND 20) DATA INITIALLY DEFERRED REFRESH DEFERRED MAINTAINED BY USER ORGANIZE BY COLUMN - Libellés de sécurité de colonne hérités par une table de requête matérialisée.
Générer une table de requêtes matérialiséeCREATE SECURITY LABEL COMPONENT level_array ARRAY ['A', 'B', 'C'] CREATE SECURITY POLICY P COMPONENTS level_array WITH DB2LBACRULES CREATE SECURITY LABEL P.A COMPONENT level_array 'A' CREATE SECURITY LABEL P.B COMPONENT level_array 'B' CREATE SECURITY LABEL P.C COMPONENT level_array 'C' CREATE TABLE t1 (c1 INT, c2 INT SECURED WITH B, c3 REAL SECURED WITH A) SECURITY POLICY P CREATE TABLE t2 (c4 REAL, c5 INT SECURED WITH C, c6 DB2SECURITYLABEL) SECURITY POLICY P
L'étiquette de sécurité de t1.c2 est utilisée pour calculer les étiquettes de sécurité de toutes les colonnes de m1 car elle apparaît dans les prédicats de la requête. Les propriétés de contrôle d'accès LBAC de la table de requêtes matérialisée m1 sont les suivantes :CREATE TABLE m1 AS (SELECT c1, c3, c5, c6 FROM t1,t2 WHERE c2 !=100) DATA INITALLY DEFERRED REFRESH DEFERRED- Politique de sécurité = P
- Étiquette de sécurité de la colonne m1.c1 = P. B
- Label de sécurité de la colonne m1.c3 = P.A
- Étiquette de sécurité de la colonne m1.c5 = P. B
- Étiquette de sécurité de la colonne m1.c6 = P. B et il est également DB2SECURITYLABEL.
Les propriétés de contrôle d'accès basées sur l'étiquette de la table de transfert st1 sont les suivantes :CREATE TABLE st1 FOR m1 PROPAGATE IMMEDIATE- Politique de sécurité = P
- Étiquette de sécurité de la colonne st1.c1 = P. B
- Étiquette de sécurité de la colonne st1.c3 = P. A
- Label de sécurité de la colonne st1.c5 = P.B
- Étiquette de sécurité de la colonne st1.c6 = P. B et il est également DB2SECURITYLABEL.
L'exemple suivant montre comment créer une table ombre appelée T1_SHADOW basée sur la table organisée par ligne T1.
- Créez la table de base et définissez une clé primaire. La clé primaire de la table de base doit être incluse dans la liste de sélection de la table fantômes. La clé primaire de la table fantôme est requise pour fournir un mappage un à un pour chaque ligne de la table de base vers la ligne correspondante dans la table fantôme. La clé primaire facilite également la maintenance de la table fantôme.
CREATE TABLE t1 ( c1 INTEGER NOT NULL, c2 INTEGER ) ORGANIZE BY ROW; ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY(c1); - Créez la table fantôme.
CREATE TABLE t1_shadow AS (SELECT c1, c2 FROM t1) DATA INITIALLY DEFERRED REFRESH DEFERRED MAINTAINED BY REPLICATION ORGANIZE BY COLUMN; SET INTEGRITY FOR t1_shadow ALL IMMEDIATE UNCHECKED; ALTER TABLE t1_shadow ADD CONSTRAINT t1_shadow_pk PRIMARY KEY (c1);
- Créez la table de base et définissez une clé primaire. La clé primaire de la table de base doit être incluse dans la liste de sélection de la table fantômes. La clé primaire de la table fantôme est requise pour fournir un mappage un à un pour chaque ligne de la table de base vers la ligne correspondante dans la table fantôme. La clé primaire facilite également la maintenance de la table fantôme.
- Créez une table nommée STRING_UNITS, qui illustre chaque spécification d'unité de chaîne possible.
Les colonnes possèdent les unités de chaîne suivantes :CREATE TABLE string_units (c1 VARCHAR(10), c2 VARCHAR(10 OCTETS), c3 VARCHAR(10 CODEUNITS32), c4 VARGRAPHIC(10), c5 VARGRAPHIC(10 CODEUNITS16), c6 VARGRAPHIC(10 CODEUNITS32))- c1 = OCTETS, si les unités de chaîne d'environnement sont SYSTEM ; CODEUNITS32 si les unités de chaîne d'environnement sont CODEUNITS32
- c2 = OCTETS
- c3 = CODEUNITS32
- c4 = CODEUNITS16, si les unités de chaîne d'environnement sont SYSTEM ; CODEUNITS32 si les unités de chaîne d'environnement sont CODEUNITS32
- c5 = CODEUNITS16
- c6 = CODEUNITS32
- Créez une table de distribution aléatoire à l'aide de la méthode aléatoire par une méthode unique. Les clés de distribution sont automatiquement définies sur les deux clés de l'index : ID et NAME.
CREATE TABLE RAND_BY_UNIQUE (ID BIGINT NOT NULL, NAME CHAR(25) NOT NULL, DESCRIPTION VARCHAR(1000), PRIMARY KEY(ID, NAME)) DISTRIBUTE BY RANDOM - Créez une table de distribution aléatoire à l'aide de la méthode aléatoire par génération. La clé de distribution est définie sur une colonne interne RANDOM_DISTRIBUTION_KEY qui est masquée à partir de SQL, sauf si elle est explicitement spécifiée.
CREATE TABLE RAND_BY_GENERATION (C1 BIGINT) DISTRIBUTE BY RANDOM
