Maison / Maîtriser le PC / Syntaxe de l'instruction alter table. Syntaxe de l'instruction alter table ALTER TABLE pour ajouter des clés

Syntaxe de l'instruction alter table. Syntaxe de l'instruction alter table ALTER TABLE pour ajouter des clés

ALTER TABLE - modifier la définition de la table

Syntaxe

ALTER TABLE [SI EXISTE] [UNIQUEMENT] Nom [ * ] action[, ... ] ALTER TABLE [ SI EXISTE ] [ UNIQUEMENT ] Nom[ * ] RENOMMER [ COLONNE ] nom de colonneÀ nouveau_nom_colonne ALTER TABLE [SI EXISTE] [UNIQUEMENT] Nom[ * ] RENOMMER LA CONTRAINTE nom_contrainteÀ nouveau_constraint_name MODIFIER LA TABLE [SI EXISTE] Nom RENOMMER EN nouveau nom MODIFIER LA TABLE [SI EXISTE] Nom DÉFINIR LE SCHÉMA nouveau_schéma ALTER TABLE TOUT DANS TABLESPACE Nom[APPROPRIÉTÉ DE nom de rôle[, ... ] ] FIXER L'ESPACE TABLE nouveau_table_space[NON ATTENDS] action pourrait être le suivant : AJOUTER [COLONNE] [SI N'EXISTE PAS] nom de colonne Type de données[COLLATIONNER règle_de tri ] [ contrainte_colonne[ ... ] ] SUPPRIMER [ COLONNE ] [ SI EXISTE ] nom de colonne[ RESTREINDRE | CASCADE ] MODIFIER [ COLONNE ] nom de colonne[ CONFIGURER LES DONNÉES ] TYPE Type de données[COLLATIONNER règle_de tri] [ EN UTILISANT expression] MODIFIER [ COLONNE ] nom de colonne DÉFINIR PAR DEFAUT expression MODIFIER [COLONNE] nom de colonne SUPPRIMER LA MODIFICATION PAR DÉFAUT [COLONNE] nom de colonne( SET | DROP ) NON NULL ALTER [ COLONNE ] nom de colonne DÉFINIR LES STATISTIQUES entier MODIFIER [COLONNE] nom de colonne ENSEMBLE ( attribut = signification[, ... ]) MODIFIER [ COLONNE ] nom de colonne RÉINITIALISER ( attribut[, ... ]) MODIFIER [ COLONNE ] nom de colonne DÉFINIR LE STOCKAGE (PLAIN | EXTERNE | ÉTENDU | PRINCIPAL) AJOUTER contrainte_table[ NON VALABLE ] AJOUTER MODIFIER LA CONTRAINTE nom_contrainte[DIFFÉRABLE | NON DIFFÉRÉ ] [ INITIALEMENT DIFFÉRÉ | INITIALEMENT IMMÉDIATE ] VALIDER LA CONTRAINTE nom_contrainte SUPPRIMER LA CONTRAINTE [SI EXISTE] nom_contrainte[ RESTREINDRE | CASCADE ] DÉSACTIVER LE DÉCLENCHEUR [ nom_déclencheur| TOUS | UTILISATEUR ] ACTIVER LE DÉCLENCHEMENT [ nom_déclencheur| TOUS | UTILISATEUR ] ACTIVER LE DÉCLENCHEMENT DE LA RÉPLIQUE nom_déclencheur ACTIVER TOUJOURS DÉCLENCHEMENT nom_déclencheur DÉSACTIVER LA RÈGLE rewrite_rule_name ACTIVER LA RÈGLE rewrite_rule_name ACTIVER LA RÈGLE DE RÉPLIQUE rewrite_rule_name ACTIVER TOUJOURS RÈGLE rewrite_rule_name DÉSACTIVER LA SÉCURITÉ AU NIVEAU LIGNE ACTIVER LA SÉCURITÉ AU NIVEAU LIGNE FORCER LA SÉCURITÉ AU NIVEAU LIGNE AUCUN FORCER LE CLUSTER DE SÉCURITÉ AU NIVEAU LIGNE ON nom_index ENSEMBLE SANS CLUSTER ENSEMBLE AVEC OIDS ENSEMBLE SANS OIDS ENSEMBLE TABLESPACE nouveau_table_space ENSEMBLE (ENREGISTRÉ | NON ENREGISTRÉ) ENSEMBLE ( paramètre_stockage = signification[, ... ]) RÉINITIALISER ( paramètre_stockage[, ... ]) HÉRITER table_parent PAS D'HÉRITAGE table_parent DE nom_type PAS DU PROPRIÉTAIRE DE ( nouveau propriétaire| CURRENT_USER | SESSION_USER ) IDENTITÉ DE LA RÉPLIQUE ( PAR DÉFAUT | UTILISATION DE L'INDEX nom_index| COMPLET | RIEN) Et table_constraint_by_index: [ CONTRAINTE nom_contrainte] ( UNIQUE | CLÉ PRIMAIRE ) À L'AIDE DE L'INDEX nom_index[DIFFÉRABLE | NON DIFFÉRÉ ] [ INITIALEMENT DIFFÉRÉ | INITIALEMENT IMMÉDIAT ]

Description

ALTER TABLE change la définition tableau existant. Plusieurs de ses variétés sont décrites ci-dessous. Notez que différentes versions peuvent nécessiter différents niveaux de verrouillage. Sauf indication contraire explicite, un verrou ACCESS EXCLUSIVE est requis. Lors de la liste de plusieurs sous-commandes, le verrou le plus puissant dont elles ont besoin sera demandé.

AJOUTER UNE COLONNE [SI N'EXISTE PAS]

Ce formulaire ajoute une nouvelle colonne au tableau, en utilisant la même syntaxe que CREATE TABLE. Si IF NOT EXISTS est spécifié et qu’une colonne portant ce nom existe déjà, ce ne sera pas une erreur. SUPPRIMER LA COLONNE [SI EXISTE]

Ce formulaire supprime une colonne d'un tableau. Cela supprimera automatiquement les index et les contraintes de table associés à cette colonne. Si des objets en dehors de la table dépendent de cette colonne, tels que des clés étrangères ou des vues, vous pouvez les supprimer en ajoutant l'astuce CASCADE. Si la commande spécifie SI EXISTE et que la colonne n'existe pas, cela n'est pas considéré comme une erreur ; une note est simplement émise. DÉFINIR LE TYPE DE DONNÉES

Ce formulaire modifie le type de colonne du tableau. Les index et les contraintes de table simples qui incluent cette colonne seront automatiquement convertis pour utiliser le nouveau type de colonne en ré-analysant l'expression qui les définit. La clause facultative COLLATE spécifie une règle de classement pour la nouvelle colonne ; en cas d'omission, le classement par défaut pour le nouveau type est sélectionné. La clause USING facultative spécifie comment la nouvelle valeur de colonne sera dérivée de l'ancienne ; s'il n'est pas présent, une conversion de type par défaut est effectuée, tout comme une affectation normale d'une valeur d'un ancien type à un nouveau. La clause USING devient requise si une conversion implicite ou une affectation de conversion de l'ancien vers le nouveau type n'est pas définie. DÉFINIR / SUPPRIMER LA DÉFAUT

Ces formulaires définissent ou suppriment les valeurs par défaut des colonnes. Les valeurs par défaut s'appliquent uniquement aux commandes INSERT ou UPDATE suivantes ; leurs modifications ne sont pas reflétées dans les lignes qui existent déjà dans le tableau. SET / DROP NON NULL

Ces formulaires déterminent si la colonne acceptera ou non les valeurs NULL. Vous pouvez spécifier SET NOT NULL uniquement si la colonne ne contient pas de valeurs NULL. DÉFINIR LES STATISTIQUES

Ce formulaire définit la référence pour la collecte de statistiques sur la colonne pour les opérations ANALYZE ultérieures. Gamme valeurs acceptables point de repère : 0..10000 ; si -1, la valeur par défaut du système (default_statistics_target) est appliquée. Pour plus d'informations sur l'utilisation des statistiques par le planificateur de requêtes Postgres Pro, consultez la Section 14.2.

SET STATISTICS demande le verrou SHARE UPDATE EXCLUSIVE. ENSEMBLE ( attribut = signification [, ... ])
RÉINITIALISER ( attribut [, ... ])

Ce formulaire définit ou réinitialise les paramètres d'attribut. Actuellement, les seuls paramètres d'attribut sont n_distinct et n_distinct_inherited , qui remplacent les estimations number_of_distinct_value produites par les opérations ANALYZE ultérieures. L'attribut n_distinct affecte le calcul des statistiques de la table elle-même, et n_distinct_inherited affecte les statistiques de la table et de ses descendants. Si la valeur spécifiée est positive, ANALYZE supposera que la colonne contient autant de valeurs distinctes non NULL. Si la valeur donnée est négative (elle doit être supérieure ou égale à -1), ANALYZE supposera que le nombre de valeurs distinctes non NULL dans la colonne varie linéairement avec la taille du tableau ; le nombre exact sera obtenu en multipliant la taille approximative du tableau par la valeur absolue du paramètre. Par exemple, -1 supposera que toutes les valeurs de la colonne sont différentes et -0,5 supposera qu'en moyenne chaque valeur est répétée deux fois. Cela peut être utile lorsque la taille de la table change au fil du temps, puisque la multiplication par le nombre de lignes de la table n'est effectuée que lors de la planification des requêtes. Avec 0, le nombre de valeurs différentes est évalué comme d'habitude. Pour plus d'informations sur l'utilisation des statistiques par le planificateur de requêtes Postgres Pro, consultez la Section 14.2.

Pour modifier les paramètres d'attribut, un verrou SHARE UPDATE EXCLUSIVE est demandé. STOCKAGE DES ENSEMBLES

Ce formulaire définit le mode de stockage de la colonne. Il détermine si les données sont stockées dans une table ou dans une table TOAST distincte, et si elles sont compressées. Le mode PLAIN doit être utilisé pour les valeurs de longueur fixe telles que entier ; Il s'agit d'une option de stockage interne sans compression. Le mode MAIN est utilisé pour stocker en interne des données compressées, EXTERNAL est utilisé pour stocker des données non compressées en externe et EXTENDED est utilisé pour stocker des données compressées en externe. EXTENDED est la valeur par défaut pour la plupart des types de données prenant en charge le stockage non PLAIN. L'utilisation d'EXTERNAL vous permet d'accélérer les opérations avec des sous-chaînes sur de très grandes valeurs de texte et d'octets, au prix d'une perte d'espace de stockage. Notez que la clause SET STORAGE elle-même ne change rien dans la table, elle spécifie uniquement la stratégie qui sera implémentée pour les futures modifications de la table. Pour plus d'informations, voir la section 62.2. AJOUTER contrainte_table[PAS VALIDE]

Ce formulaire ajoute une nouvelle contrainte à la table, avec la même syntaxe que CREATE TABLE avec l'indication supplémentaire NOT VALID, qui n'est actuellement autorisée que pour les contraintes de clé étrangère et de vérification. Si une contrainte est marquée NOT VALID , la vérification initiale potentiellement longue que toutes les lignes la satisfont est ignorée. Cependant, cette contrainte restera en vigueur pour les ajouts ou modifications ultérieurs des données (c'est-à-dire que ces opérations ne seront pas effectuées si la nouvelle ligne viole la contrainte de vérification, ou s'il y a une clé étrangère dans la table principale, il n'y a pas ligne correspondante). Mais la base de données ne supposera pas que la contrainte est valable pour toutes les lignes de la table tant qu'elle n'est pas vérifiée à l'aide de l'indicateur VALIDATE CONSTRAINT. AJOUTER table_constraint_by_index

Ce formulaire ajoute une nouvelle contrainte PRIMARY KEY ou UNIQUE à la table en fonction d'un index unique existant. Cette limite inclura toutes les colonnes de l'index.

Un index ne peut pas être partiel et ne peut pas inclure de colonnes d'expression. De plus, il doit s'agir d'un index B-tree avec l'ordre de tri par défaut. Avec ces restrictions, les index ajoutés ne seront pas différents des index créés par les commandes régulières ADD PRIMARY KEY et ADD UNIQUE.

Dans le cas de la spécification de PRIMARY KEY , si les colonnes d'index ne sont pas déjà marquées NOT NULL , cette commande va essayer de ALTER COLUMN SET NOT NULL pour chaque colonne. Cela nécessitera une analyse complète de la table pour garantir que la ou les colonnes ne contiennent pas de valeurs NULL. Dans tous les autres cas, il s'agit d'une opération rapide.

Si un nom de contrainte est spécifié, l'index sera renommé avec le nom spécifié. Sinon, le nom de la contrainte sera le nom de l'index.

Après avoir exécuté cette commande, l'index devient "qui appartiennent" contrainte, comme si elle avait été créée avec une commande ADD PRIMARY KEY ou ADD UNIQUE normale. Cela signifie notamment que lorsqu'une contrainte est supprimée, l'index sera supprimé avec elle.

Note

L'ajout d'une contrainte basée sur un index existant est utile dans les situations où une nouvelle contrainte doit être ajoutée sans bloquer les modifications apportées à la table pour pendant longtemps. Pour ce faire, vous pouvez créer un index avec la commande CREATE INDEX CONCURRENTLY, puis l'utiliser comme contrainte à part entière à l'aide de cette entrée. Voir l'exemple suivant.

MODIFIER LA CONTRAINTE

Ce formulaire modifie les attributs d'une contrainte créée précédemment. Actuellement, seules les contraintes de clé étrangère peuvent être modifiées. VALIDER LA CONTRAINTE

Ce formulaire teste une contrainte de clé étrangère ou une contrainte de vérification précédemment créée avec la clause NOT VALID, en analysant l'intégralité de la table pour garantir que toutes les lignes satisfont à la contrainte. Si la contrainte est déjà marquée comme vraie, rien ne se passe.

La vérification de grandes tables peut prendre beaucoup de temps. L'intérêt de séparer le contrôle de la création proprement dite de la contrainte est que cela permet de reporter le contrôle pour un temps de moindre activité ou d'effectuer travail supplémentaire Avec erreurs existantes et en même temps en empêcher de nouveaux. Notez également que pendant l'exécution de la vérification, elle n'empêche pas en soi l'exécution des commandes normales d'écriture de table.

La vérification demande uniquement un verrou SHARE UPDATE EXCLUSIVE sur la table cible. Les contraintes de clé étrangère nécessitent également un verrou ROW SHARE sur la table référencée par la contrainte. SUPPRIMER LA CONTRAINTE [SI EXISTE]

Ce formulaire supprime la contrainte de table spécifiée. Si IF EXISTS est spécifié et que la contrainte spécifiée n'existe pas, cela n'est pas considéré comme une erreur. Dans ce cas, seule une note est émise. DÉSACTIVER / ACTIVER [ RÉPLIQUE | TOUJOURS] DÉCLENCHEUR

Ces formulaires configurent le(s) déclencheur(s) appartenant à la table à déclencher. Un déclencheur désactivé est stocké dans le système, mais n'est pas exécuté lorsque l'événement déclencheur se produit. Pour les déclencheurs différés, l'état d'activation est vérifié lorsque l'événement se produit, et non lorsque la fonction de déclenchement est réellement appelée. Cette commande peut désactiver ou activer un seul déclencheur par nom, tous les déclencheurs de table ou uniquement les déclencheurs personnalisés (à l'exclusion des déclencheurs de contrainte générés en interne, tels que les déclencheurs qui implémentent des contraintes de clé étrangère ou des contraintes d'unicité ou d'exception différées). Les droits de superutilisateur sont requis pour désactiver ou activer les déclencheurs de restrictions internes du système générés ; Leur désactivation doit être effectuée avec prudence, car il est évident que l'intégrité des contraintes ne peut être garantie si les déclencheurs ne fonctionnent pas. Le mécanisme de déclenchement est également affecté par la variable de configuration session_replication_role. Les déclencheurs activés sans instructions supplémentaires se déclencheront lorsque le rôle de réplication est " "origine"(par défaut) ou " locale". Les déclencheurs activés en spécifiant ENABLE REPLICA ne se déclencheront que si le mode de session actuel est " réplique », et après avoir spécifié ENABLE ALWAYS, déclenche le feu indépendamment du mode actuel réplication.

Cette commande demande le verrou SHARE ROW EXCLUSIVE. DÉSACTIVER / ACTIVER [ RÉPLIQUE | TOUJOURS] RÈGLE

Ces formulaires configurent la manière dont les règles de réécriture spécifiques à une table sont déclenchées. Une règle désactivée est enregistrée dans le système, mais n'est pas appliquée lors de la réécriture de la requête. Essentiellement, ces opérations sont similaires aux opérations d’activation/désactivation des déclencheurs. Toutefois, cela ne s'applique pas aux règles ON SELECT : elles sont toujours appliquées pour garantir que les vues continuent de fonctionner, même dans les sessions qui n'effectuent pas de rôle de réplication principal. DÉSACTIVER/ACTIVER LA SÉCURITÉ AU NIVEAU DES LIGNES

Ces formulaires contrôlent l’application des stratégies de protection des lignes spécifiques aux tables. Si la protection est activée, mais qu'aucune stratégie n'est définie pour la table, la stratégie de refus d'accès par défaut est appliquée. Notez que des stratégies peuvent être définies pour une table même si la sécurité au niveau des lignes est désactivée. Dans ce cas, les stratégies ne sont PAS appliquées et leurs restrictions sont ignorées. Voir également CRÉER UNE POLITIQUE. SÉCURITÉ AU NIVEAU DES RANGÉES AUCUNE FORCE / FORCE

Ces formulaires contrôlent l'application des stratégies de protection des lignes spécifiques à la table lorsqu'un utilisateur est le propriétaire de la table. Si ce comportement est activé, les politiques de sécurité au niveau des lignes s'appliqueront également au propriétaire de la table. Si elle est désactivée (valeur par défaut), la protection au niveau des lignes ne s'appliquera pas à l'utilisateur propriétaire de la table. Voir également CRÉER UNE POLITIQUE. GRAPPE ACTIVÉE

Ce formulaire sélectionne l'index par défaut pour les opérations CLUSTER ultérieures. Le clustering réel de la table n'est pas effectué.

Pour modifier les paramètres de clustering, un verrou SHARE UPDATE EXCLUSIVE est demandé. ENSEMBLE SANS CLUSTER

Ce formulaire supprime la dernière référence d'index spécifiée pour CLUSTER. Son effet affectera les futures opérations de clustering pour lesquelles aucun index n'est spécifié.

Pour modifier les paramètres de clustering, un verrou SHARE UPDATE EXCLUSIVE est demandé. ENSEMBLE AVEC OIDS

Ce formulaire ajoute la colonne du système oid au tableau (voir Section 5.4). Si la table possède déjà une telle colonne, cela ne fait rien.

Notez que ce n'est pas la même chose que la commande ADD COLUMN oid oid (cette commande ajoutera une colonne normale avec le nom approprié oid, plutôt qu'une colonne système). ENSEMBLE SANS OIDES

Ce formulaire supprime la colonne du système oid du tableau. C'est exactement la même chose que DROP COLUMN oid RESTRICT , sauf qu'il n'y aura pas d'erreur si la colonne oid est manquante. DÉFINIR L'ESPACE TABLE

Ce formulaire remplace l'espace table de la table par celui spécifié et déplace les fichiers de données associés à la table vers le nouvel espace. Les index de table, le cas échéant, ne sont pas déplacés ; cependant, ils peuvent être déplacés séparément avec des commandes SET TABLESPACE supplémentaires. Le formulaire ALL IN TABLESPACE vous permet de déplacer toutes les tables de la base de données actuelle vers un autre tablespace en verrouillant d'abord toutes les tables puis en déplaçant chacune d'elles. Ce formulaire prend également en charge la clause OWNED BY, qui déplace uniquement les tables du propriétaire spécifié. Si l'option NOWAIT est spécifiée, la commande échouera si elle ne peut pas acquérir immédiatement tous les verrous requis. Notez que ce formulaire ne déplace pas les répertoires système ; si vous devez les déplacer, vous devez utiliser ALTER DATABASE ou des appels explicites ALTER TABLE. Les relations information_schema ne sont pas considérées comme faisant partie des catalogues système et sont sujettes à déplacement. Voir aussi CRÉER UN ESPACE TABLE. ENSEMBLE (ENREGISTRÉ | NON ENREGISTRÉ)

Ce formulaire modifie les caractéristiques de journalisation de la table, rendant la table respectivement journalisée/non journalisée (voir UNLOGGED). Cela ne s'applique pas à une table temporaire. ENSEMBLE ( paramètre_stockage = signification [, ... ])

Ce formulaire modifie une ou plusieurs options de stockage de table. Plus de détails sur les paramètres valides sont décrits dans Options de stockage. Notez que cette commande ne modifie pas immédiatement le contenu de la table ; Selon le paramètre, les tableaux devront peut-être être réécrits pour obtenir l'effet souhaité. Cela peut être fait en utilisant les commandes VACUUM FULL, CLUSTER ou l'une des formes de commandes ALTER TABLE, qui forcent un écrasement de la table.

Un verrou SHARE UPDATE EXCLUSIVE est requis pour modifier le facteur de remplissage et les paramètres de vide automatique.

Note

Bien que CREATE TABLE vous permette de spécifier OIDS dans la syntaxe WITH ( paramètre_stockage), ALTER TABLE ne traite pas OIDS comme paramètre de stockage. Par conséquent, pour modifier la caractéristique OID, vous devez utiliser les formulaires SET AVEC OIDS et SET SANS OIDS.

RÉINITIALISER ( paramètre_stockage [, ... ])

Ce formulaire réinitialise une ou plusieurs options de stockage à leurs valeurs par défaut. Comme avec SET, la mise à jour complète de la table peut nécessiter son écrasement. HÉRITER table_parent

Ce formulaire désigne la table cible comme enfant de la table parent spécifiée. Par la suite, les requêtes sur la table parent incluront également les enregistrements de la table cible. Pour qu'une table devienne enfant, elle doit contenir les mêmes colonnes que son parent (même si elle peut inclure des colonnes supplémentaires). Les colonnes doivent avoir le même type de données, et si l'une d'entre elles a une contrainte NOT NULL dans la table parent, elle doit également avoir une contrainte NOT NULL dans la table enfant.

De plus, la table enfant doit contenir toutes les contraintes CHECK de la table parent, à l'exception de celles non héritables (c'est-à-dire celles créées par la commande ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT), qui sont ignorées ; cependant, toutes les restrictions correspondantes dans la table descendante ne doivent pas être non-héritables. Actuellement les contraintes UNIQUE , PRIMARY KEY et FOREIGN KEY ne sont pas respectées, mais cela pourrait changer dans le futur. PAS D'HÉRITAGE table_parent

Ce formulaire supprime la table cible de la liste des enfants de la table parent spécifiée. Les résultats des requêtes sur la table parent n'incluront alors pas les enregistrements extraits de la table cible. DE nom_type

Ce formulaire associe une table à un type composite comme si elle avait été créée par la commande CREATE TABLE OF. Dans ce cas, la liste des noms et types de colonnes doit correspondre exactement à ce qui forme le type composite ; la différence est possible dans l'oid de la colonne système. De plus, la table ne doit être l’enfant d’aucune autre table. Ces restrictions garantissent que la commande CREATE TABLE OF créera une table avec la même définition. PAS DE

Ce formulaire rompt le lien entre une table typée et son type. PROPRIÉTAIRE

Ce formulaire remplace le propriétaire d'une table, d'une séquence, d'une vue, d'une vue matérialisée ou d'une table étrangère par l'utilisateur spécifié. IDENTITÉ DE LA RÉPLIQUE

Ce formulaire modifie les informations écrites dans le journal d'écriture anticipée pour identifier les lignes modifiées ou supprimées. Ce paramètre Valable uniquement lors de l'utilisation de la réplication logique. Le mode DEFAULT (par défaut pour les tables non système) enregistre les anciennes valeurs des colonnes de clé primaire, le cas échéant. Le mode USING INDEX enregistre les anciennes valeurs des colonnes qui composent l'index spécifié, qui doivent être uniques, non partielles, non différées et inclure uniquement les colonnes marquées NOT NULL . Le mode FULL enregistre les anciennes valeurs de toutes les colonnes de la ligne, tandis que le mode RIEN (par défaut pour les tables système) n'enregistre aucune information sur l'ancienne ligne. Dans tous les cas, les anciennes valeurs ne sont enregistrées que si au moins une des colonnes à enregistrer présente un changement dans la nouvelle ligne. RENOMMER

Les formulaires RENAME modifient le nom d'une table (ou d'un index, d'une séquence, d'une vue, d'une vue matérialisée ou d'une table étrangère), le nom d'une colonne de table individuelle ou le nom d'une contrainte de table. Cela n'affecte pas les données stockées. DÉFINIR LE SCHÉMA

Ce formulaire déplace la table vers un autre schéma. Les index et contraintes qui lui sont associés, ainsi que les séquences appartenant aux colonnes du tableau, se déplacent avec le tableau.

Tous les types de ALTER TABLE qui affectent une seule table, à l'exception de RENAME et SET SCHEMA , peuvent être combinés en une liste de plusieurs modifications et appliqués ensemble. Par exemple, vous pouvez ajouter plusieurs colonnes et/ou modifier les types de colonnes en une seule commande. Ceci est particulièrement utile pour les grandes tables, puisque la totalité de la table est traitée en un seul passage.

Seul le propriétaire de la table correspondante peut exécuter ALTER TABLE. Pour modifier le schéma ou le tablespace d'une table, vous devez également disposer du privilège CREATE sur le nouveau schéma ou le nouveau tablespace. Pour faire d’une table l’enfant d’une autre table, vous devez également être propriétaire de la table parent. Pour changer de propriétaire, vous devez être membre direct ou indirect du nouveau rôle propriétaire, et ce rôle doit disposer du privilège CREATE sur le schéma de table. (Avec ces restrictions, rien ne se passe lorsque vous modifiez la propriété que vous ne pourriez pas faire si vous aviez le droit de supprimer et de recréer la table. Cependant, un superutilisateur peut de toute façon changer le propriétaire d'une table.) Pour ajouter une colonne, modifiez un type de colonne, ou appliquer une clause OF, vous devez également disposer du droit USAGE pour le type de données correspondant.

Possibilités

Le nom (éventuellement complet avec schéma) de la table existante à modifier. Si ONLY est spécifié avant un nom de table, seule la table spécifiée est modifiée. Sans SEULEMENT, la table spécifiée et tous ses descendants (le cas échéant) sont modifiés. Vous pouvez également ajouter un * facultatif après le nom de la table pour indiquer explicitement que toutes les tables enfants sont affectées. nom de colonne

Le nom de la colonne nouvelle ou existante. nouveau_nom_colonne

Nouveau nom pour une colonne existante. nouveau nom

Nouveau nom de table. Type de données

Le type de données d'une nouvelle colonne ou le nouveau type de données d'une colonne existante. contrainte_table

Nouvelle contrainte de table. nom_contrainte

Le nom de la contrainte nouvelle ou existante. CASCADE

Supprimez automatiquement les objets qui dépendent de la colonne ou de la contrainte à supprimer (par exemple, les vues contenant cette colonne), et par conséquent tous les objets qui en dépendent (voir Section 5.13). LIMITER

Refusez de supprimer une colonne ou une contrainte s'il y a des objets qui en dépendent. Ceci est le comportement par défaut. nom_déclencheur

Le nom du déclencheur à activer ou à désactiver. TOUS

Désactivez ou activez tous les déclencheurs appartenant à la table. (Cela nécessite des droits de superutilisateur si ces déclencheurs incluent des déclencheurs d'exception internes générés, tels que ceux qui implémentent des contraintes de clé étrangère ou des contraintes d'unicité et d'exception différées.) UTILISATEUR

Désactivez ou activez tous les déclencheurs appartenant à une table, à l'exception des déclencheurs d'exception générés en interne, tels que ceux qui implémentent des contraintes de clé étrangère ou des contraintes d'unicité et d'exception différées. nom_index

Le nom de l'index existant. paramètre_stockage

Nom du paramètre de stockage de table signification

Nouvelle valeur pour le paramètre de stockage de table. Cela peut être un nombre ou une chaîne, selon le paramètre. table_parent

La table parent à partir de laquelle la table sera liée ou dissociée. nouveau propriétaire

Le nom de l'utilisateur à désigner comme nouveau propriétaire de la table. nouveau_table_space

Le nom du tablespace vers lequel la table sera déplacée. nouveau_schéma

Le nom du schéma vers lequel la table sera déplacée.

Remarques

Le mot-clé COLUMN n'a aucune signification et peut être omis.

Lorsqu'une colonne est ajoutée à l'aide de ADD COLUMN , toutes les lignes existantes de la table sont initialisées avec cette colonne avec une valeur par défaut (ou NULL s'il n'y a pas de clause DEFAULT pour la colonne). Si la clause DEFAULT est manquante, cela revient à modifier uniquement les métadonnées ; il n'y a pas de modification directe des données de la table ; Les valeurs NULL ajoutées sont imprimées lors de la lecture.

L'ajout d'une colonne avec une clause DEFAULT ou la modification du type d'une colonne existante écrasera la table entière et ses index. Mais il peut y avoir une exception lors de la modification du type d'une colonne existante : si la clause USING ne modifie pas le contenu de la colonne et que l'ancien type est converti en binaire vers le nouveau ou est un domaine sans contrainte sur le nouveau type, une table la réécriture n'est pas nécessaire ; bien que tous les index avec des colonnes affectées doivent encore être reconstruits. L'ajout ou la suppression d'une colonne d'oid système nécessite également de réécrire l'intégralité de la table. La reconstruction de grandes tables et/ou de leurs index peut être un processus long qui nécessite temporairement deux fois plus d'espace disque.

L'ajout d'une contrainte CHECK ou NOT NULL nécessite que vous parcouriez la table pour vous assurer que toutes les lignes existantes satisfont à la contrainte, mais ne nécessite pas d'écraser la table.

La possibilité de combiner plusieurs modifications en une seule commande ALTER TABLE est utile principalement car elle vous permet de combiner les analyses de table et les réécritures de table requises par ces opérations et de les effectuer en une seule passe.

Le formulaire DROP COLUMN ne supprime pas physiquement la colonne, mais la rend simplement invisible pour les opérations SQL. Les opérations d'ajout ou de mise à jour ultérieures enregistreront une valeur NULL dans cette colonne. Ainsi, la suppression d'une colonne est rapide, mais ne réduit pas la taille de la table sur le disque car l'espace occupé par la colonne supprimée n'est pas libéré. Cet espace sera libéré au fur et à mesure des modifications des lignes existantes. (Lorsque la colonne oid système est supprimée, ce comportement n'est pas observé car la table est immédiatement écrasée.)

Pour forcer l'occupation de l'espace par une colonne qui a été supprimée, vous pouvez émettre l'un des formulaires ALTER TABLE, qui écrase la table entière. Par conséquent, toutes les lignes seront recréées afin que la colonne supprimée contienne NULL.

Les formulaires d'écrasement ALTER TABLE ne sont pas sécurisés par MVCC. Après la réécriture, la table apparaîtra vide pour les transactions simultanées si elles travaillent sur un instantané pris avant la réécriture. Reportez-vous à la section 13.5 pour plus de détails.

Dans la clause USING de la clause SET DATA TYPE, vous pouvez réellement écrire une expression avec les anciennes valeurs de ligne ; c'est-à-dire qu'il peut faire référence à la fois aux colonnes en cours de conversion et à d'autres. Cela permet d'écrire des transformations de données très générales dans SET DATA TYPE. En raison de cette flexibilité, l'expression USING ne s'applique pas à la valeur par défaut d'une colonne donnée (s'il y en a une) ; le résultat peut ne pas être une expression constante, ce qui est requis pour la valeur par défaut. Cela signifie qu'en l'absence d'une conversion ou d'une affectation explicite de l'ancien type vers le nouveau, SET DATA TYPE peut ne pas parvenir à convertir la valeur par défaut, même si la clause USING est appliquée. Dans ces cas, vous devez supprimer la valeur par défaut à l’aide de DROP DEFAULT , émettre ALTER TYPE , puis utiliser SET DEFAULT pour définir une nouvelle valeur par défaut appropriée. Des considérations similaires s'appliquent aux index et aux contraintes sur cette colonne.

Si une table comporte des tables enfants, vous ne pouvez pas ajouter, renommer ou modifier le type d'une colonne, ni renommer une contrainte héritée dans la table parent sans faire de même dans toutes les tables enfants. Autrement dit, la commande ALTER TABLE ONLY ne sera pas exécutée. Cela garantit que les tables enfants contiendront toujours les mêmes colonnes que le parent.

L'opération récursive DROP COLUMN supprimera une colonne d'une table enfant uniquement si la colonne n'hérite d'aucun autre parent et n'a pas été définie indépendamment dans la table enfant. L'opération non récursive DROP COLUMN (c'est-à-dire ALTER TABLE ONLY ... DROP COLUMN) ne supprime jamais les colonnes héritées, mais les marque plutôt comme définies indépendamment plutôt que héritées.

Les actions TRIGGER, CLUSTER, OWNER et TABLESPACE ne se propagent jamais de manière récursive aux tables enfants ; c'est-à-dire qu'ils sont toujours exécutés comme si SEULEMENT avait été spécifié. L'opération d'ajout de contrainte est effectuée de manière récursive uniquement pour les contraintes CHECK qui ne sont pas marquées NO INHERIT.

Aucune modification des tables du catalogue système n'est autorisée.

Pour plus Description détaillée pour les paramètres valides, reportez-vous à CREATE TABLE . Vous pouvez en apprendre davantage sur l'héritage au chapitre 5.

Exemples

Ajout d'une colonne varchar à une table :

ALTER TABLE distributeurs ADD COLUMN adresse varchar(30);

Supprimer une colonne d'un tableau :

Les distributeurs ALTER TABLE DROP COLUMN adresse RESTRICT ;

Changer les types de deux colonnes existantes en une seule opération :

Distributeurs ALTER TABLE ALTER COLUMN adresse TYPE varchar(80), ALTER COLUMN nom TYPE varchar(100);

Modification du type d'une colonne entière contenant l'heure de style Unix en un horodatage avec un type de fuseau horaire à l'aide de la clause USING :

ALTER TABLE foo ALTER COLUMN foo_timestamp SET DATA TYPE horodatage avec fuseau horaire USING horodatage avec fuseau horaire "epoch" + foo_timestamp * intervalle "1 seconde" ;

La même chose, mais dans le cas où la colonne a une valeur par défaut qui n'est pas automatiquement convertie en nouveau type de données :

ALTER TABLE foo ALTER COLUMN foo_timestamp DROP DEFAULT, ALTER COLUMN foo_timestamp TYPE horodatage avec fuseau horaire USING horodatage avec fuseau horaire "epoch" + foo_timestamp * intervalle "1 seconde", ALTER COLUMN foo_timestamp SET DEFAULT now();

Renommer une colonne existante :

ALTER TABLE distributeurs RENOMMER COLUMN adresse TO ville ;

Renommer une table existante :

ALTER TABLE distributeurs RENOMMER AUX fournisseurs ;

Renommer une contrainte existante :

ALTER TABLE distributeurs RENAME CONSTRAINT zipchk TO zip_check;

Ajout d'une contrainte NOT NULL à une colonne :

Distributeurs ALTER TABLE ALTER COLUMN street SET NOT NULL ;

Suppression d'une contrainte NOT NULL d'une colonne :

Distributeurs ALTER TABLE ALTER COLUMN street DROP NOT NULL ;

Ajout d'une contrainte de vérification à une table et à tous ses descendants :

ALTER TABLE distributeurs ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);

Ajout d'une contrainte de vérification uniquement à une table, mais pas à ses enfants :

ALTER TABLE distributeurs ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT ;

(Cette contrainte de vérification ne sera pas non plus héritée par les futurs enfants.)

Supprimer une contrainte de vérification d'une table et de tous ses descendants :

Distributeurs ALTER TABLE DROP CONSTRAINT zipchk;

Suppression d'une contrainte de vérification uniquement de la table elle-même :

ALTER TABLE SEULEMENT distributeurs DROP CONSTRAINT zipchk;

(La contrainte de vérification reste dans toutes les tables enfants.)

Ajout d'une contrainte de clé étrangère à une table :

ALTER TABLE distributeurs ADD CONSTRAINT distfk FOREIGN KEY (adresse) REFERENCES adresses (adresse);

Ajout d'une contrainte de clé étrangère à une table avec le moins d'impact sur le fonctionnement des autres :

ALTER TABLE distributeurs ADD CONSTRAINT distfk FOREIGN KEY (adresse) REFERENCES adresses (adresse) NON VALIDE ; Distributeurs ALTER TABLE VALIDATE CONSTRAINT distfk ;

Ajout d'une contrainte unique à une table (sur plusieurs colonnes) :

ALTER TABLE distributeurs ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);

Ajout d'une clé primaire nommée automatiquement à une table (notez qu'une table ne peut avoir qu'une seule clé primaire) :

Distributeurs ALTER TABLE ADD PRIMARY KEY (dist_id);

Déplacer une table vers un autre tablespace :

Distributeurs ALTER TABLE SET TABLESPACE fasttablespace ;

Déplacer une table vers un autre schéma :

ALTER TABLE monschéma.distributors SET SCHEMA votreschéma ;

Pour recréer une contrainte de clé primaire sans bloquer les modifications lors d'une reconstruction d'index :

CRÉER UN INDEX UNIQUE CONCURRENTEMENT dist_id_temp_idx SUR les distributeurs (dist_id); ALTER TABLE distributeurs DROP CONSTRAINT distributeurs_pkey, ADD CONSTRAINT distributeurs_pkey PRIMARY KEY USING INDEX dist_id_temp_idx ;

Compatibilité

Les formes ADD (sans USING INDEX), DROP , SET DEFAULT et SET DATA TYPE (sans USING) suivent le standard SQL. D'autres formulaires sont des extensions du standard SQL implémenté dans PostgreSQL. De plus, une extension est la possibilité de spécifier plusieurs opérations de modification dans une seule commande ALTER TABLE.

ALTER TABLE DROP COLUMN vous permet de supprimer une seule colonne d'un tableau et de laisser le tableau sans colonnes. Il s'agit d'une extension du standard SQL, qui n'autorise pas les tables avec zéro colonne.

Modifie la structure de la table d'une manière spécifiée.

Syntaxe:

ALTER TABLE NomTable1 AJOUTER | ALTER FieldName1 FieldType [(nFieldWidth [, nPrecision])] ] ] - Ou - ALTER TABLE TableName1 ALTER FieldName2 ] - Ou - ALTER TABLE TableName1 FieldName3] ] ] TAG TagName4 RÉFÉRENCES TableName2 ] ]

Possibilités :
NomTable1
Spécifie le nom de la table dont la structure est en cours de modification.
AJOUTER un nom de champ1
Spécifie le nom du champ à ajouter.
ALTER NomChamp1
Spécifie le nom du champ existant à modifier.
Type de champ [(nFieldWidth [, nPrecision]])
Spécifie le type de champ, la largeur du champ et la précision du champ (nombre de décimales) pour un champ nouveau ou modifié.
Type de champ il s'agit d'une seule lettre indiquant le type de données du champ. Certains types de champs nécessitent que vous précisiez nLargeurChamp et/ou nPrécision.
Le tableau suivant répertorie les valeurs des paramètres Type de champ; pour chacun d'eux, il est indiqué si des paramètres sont requis nLargeurChamp Et nPrécision.

FieldType nFieldWidth nPrecision Description C n - Champ de caractères de largeur n D - - Date T - - Champ DateTime N n d Champ numérique de largeur n, ayant d décimales F n d Champ de données à virgule flottante de largeur n, ayant d décimales I - - Champ Entiers B - d Champ de données double précision Y - - Champ Devise L - - Booléen M - - Champ Mémo G - - Champ Général

Possibilités nLargeurChamp Et nPrécision sont ignorés dans le cas des types D, T, I, Y, L, M, G et P. Si pour le type N, F ou B la valeur nPrécision non spécifié, il est supposé égal à zéro par défaut (pas de décimales).
NUL
Permet à un champ d'accepter des valeurs NUL.
PAS NUL
Empêche un champ d'accepter des valeurs NUL.
Si des phrases sont omises NUL Et PAS NUL, alors l'admissibilité des valeurs NUL pour le champ est déterminé par le paramètre actuel FIXER NULL. Cependant, si l'on omet les phrases NUL Et PAS NUL et demande CLÉ PRIMAIRE ou UNIQUE, installation actuelle FIXER NULL sera ignoré et la valeur par défaut du champ sera définie sur PAS NUL.
VÉRIFIER lExpression1
Spécifie la règle de validité au niveau du champ. Calcul lExpression1 doit donner une expression logique ; il peut s'agir d'une fonction définie par l'utilisateur ou d'une procédure stockée. Attention, cette règle est vérifiée lors de l'ajout d'un enregistrement vide. Si cette règle n'autorise pas les valeurs de champs vides dans l'enregistrement joint, une erreur est générée.
ERREUR cMessageText1
Spécifie le texte du message d'erreur qui s'affiche lorsqu'une erreur est détectée selon une règle de champ. Ce message apparaît uniquement lorsque vous modifiez des données dans la fenêtre d'affichage ou la fenêtre d'édition.
eExpression1 PAR DÉFAUT
Définit la valeur par défaut du champ. Type de données d'expression eExpression1 doit correspondre au type de données du champ.
CLÉ PRIMAIRE
Crée une balise d'index principale. Le nom de la balise est le même que le nom du champ.
UNIQUE
Crée une balise d'index candidate avec le même nom que le champ. Pour plus d'informations sur les index candidats, consultez le chapitre 7, Utilisation des tables, dans le Guide du développeur.
Remarque Index candidats (créés à l'aide de l'outil UNIQUE inclus dans les commandes MODIFIER TABLE Et CRÉER UN TABLEAU pour la compatibilité avec ANSI) sont différents des index créés à l'aide de l'option UNIQUEéquipes INDICE. Index créé par option UNIQUE dans une équipe INDICE, autorise les clés d'index en double ; Les clés en double ne sont pas autorisées dans les index candidats.
Le champ utilisé pour l'index principal ou l'index candidat n'autorise pas les valeurs NUL et des entrées en double.
Si vous créez un nouveau champ à l'aide de la clause ADD COLUMN, Visual FoxPro ne génère pas d'erreur lorsque vous créez un index principal ou candidat sur un champ prenant en charge les valeurs nulles. Toutefois, si vous essayez de saisir une valeur nulle ou en double dans un champ utilisé pour un index principal ou un index candidat, Visuel FoxPro donnera une erreur.
Si vous modifiez un champ existant et que l'index principal ou l'expression d'index candidat se compose uniquement du nom de ce champ, Visuel FoxPro vérifiera si le champ contient des valeurs NUL ou des entrées en double. Si de telles valeurs sont trouvées, Visuel FoxPro générera une erreur et le tableau restera inchangé. Si l'expression d'index contient plusieurs champs ou si l'expression inclut un seul champ, Visuel FoxPro ne vérifiera pas les valeurs NUL ou des entrées en double.
RÉFÉRENCES TableName2 TAG TagName1
Spécifie la table parent avec laquelle établir une relation persistante. TAG Nom de Balise1 spécifie la balise d'index de la table parent sur laquelle est basée cette relation. Le nom de la balise d’index peut contenir jusqu’à 10 caractères.
NOCPTRANS
Interdit la traduction vers une autre page de codes pour les champs de caractères et de mémo. Si une table est convertie en une autre table de caractères, les champs avec l'option NOCPTRANS ne participent pas à la traduction. NOCPTRANS ne peut être défini que pour les champs de caractères et les champs mémo.
L'exemple suivant crée une table nommée MA TABLE, qui contient deux champs de caractères et deux champs mémo. Le deuxième champ caractère char2 et le deuxième champ mémo memo2 sont définis avec l'option NOCPTRANS pour empêcher la diffusion.

CREATE TABLE matable (char1 C(10), char2 C(10) NOCPTRANS,; memo1 M, memo2, M NOCPTRANS)

ALTER NomChamp2
Spécifie le nom du champ existant à modifier.
DÉFINIR LA VALEUR PAR DÉFAUT eExpression2
Spécifie une nouvelle valeur comme valeur par défaut pour un champ existant. Type de données d'expression eExpression2 doit correspondre au type de données défini pour le champ.
SET CHECK lExpression2
Spécifie une nouvelle règle pour un champ existant. Calcul lExpression2 devrait donner une valeur booléenne ; il peut s'agir d'une fonction définie par l'utilisateur ou d'une procédure stockée.
ERREUR cMessageText2
Spécifie le texte du message d'erreur. Ce message s'affichera lorsqu'une erreur est détectée selon la règle au niveau du champ. Le message est émis uniquement lorsqu'il y a un changement dans les données dans la fenêtre de visualisation ou la fenêtre d'édition.
Abandonner la valeur par défaut
Remplace la valeur par défaut d'un champ existant.
CONTRÔLE DE CHUTE
Annule une règle pour un champ existant.
DROP Nom du champ3
Spécifie le champ à supprimer de la table. La suppression d'un champ d'une table efface également la valeur par défaut de ce champ.
Si un champ spécifie une expression de clé d'index ou une expression de déclencheur, ces expressions deviennent non valides lorsque le champ est supprimé. Dans ce cas, aucune erreur ne sera générée lorsque le champ est supprimé, mais des erreurs seront générées pour une clé d'index non valide ou des expressions de déclenchement lors de l'exécution.
SET CHECK lExpression3
Spécifie une règle au niveau de la table. Calcul lExpression3 doit produire une expression booléenne, il peut s'agir d'une fonction définie par l'utilisateur ou d'une procédure stockée.
ERREUR cMessageText3
Spécifie le texte du message d'erreur qui s'affiche lorsqu'une erreur est détectée selon une règle au niveau de la table. Ce message apparaît uniquement lorsque vous modifiez des données dans la fenêtre d'affichage ou la fenêtre d'édition.
CONTRÔLE DE CHUTE
Remplace une règle au niveau de la table.
AJOUTER LA CLÉ PRIMAIRE eExpression3 TAG TagName2
Ajoute un index principal à la table. eExpression3 spécifie l'expression de clé d'index primaire, et Nom de la balise2 nom de la balise d’index primaire. Le nom de la balise d’index peut contenir jusqu’à 10 caractères. Si TAG Nom de Balise2 omis, et eExpression3 définit un seul champ, la balise d'index principale reçoit le même nom que le champ spécifié dans l'expression eExpression3.
SUPPRIMER LA CLÉ PRIMAIRE
Supprime l'index principal et sa balise. Puisqu’une table ne peut avoir qu’une seule clé primaire, son nom peut être omis. Lorsque vous supprimez un index primaire, toutes les relations persistantes basées sur la clé primaire sont également supprimées.
AJOUTER une eExpression UNIQUE4
Ajoute un index candidat à la table. eExpression4 spécifie l'expression de clé d'index candidate, et Nom de la balise3 le nom de la balise d'index candidate. Le nom de la balise d’index peut contenir jusqu’à 10 caractères. Si l'expression TAG Nom de Balise3 omis, et eExpression4 définit un seul champ, la balise d'index candidate reçoit le même nom que le champ spécifié dans l'expression eExpression4.
SUPPRIMER LA BALISE UNIQUE TagName4
Supprime l'index candidat et sa balise. Étant donné qu'une table peut avoir plusieurs clés candidates, vous devez spécifier le nom de la balise d'index candidate à supprimer.
AJOUTER UNE ÉTIQUETTE DE CLÉ ÉTRANGÈRE TagName4
Ajoute un index externe (autre que principal) à la table. eExpression5 spécifie l'expression de clé d'index externe, et Nom de la balise4 nom de la balise d'index externe. Le nom de la balise d’index peut contenir jusqu’à 10 caractères.
RÉFÉRENCES NomTable2
Spécifie la table parent avec laquelle établir une relation persistante. Pour établir une relation avec une table parent basée sur une balise d'index existante, vous devez spécifier TAG Nom de Balise5. Le nom de la balise d’index peut contenir jusqu’à 10 caractères. Si TAG Nom de Balise5 omis, la relation est établie à l'aide de la balise d'index principale de la table parent.
SUPPRIMER L'ÉTIQUETTE DE CLÉ ÉTRANGÈRE TagName6
Supprime une clé étrangère dont la balise d'index est TagName6. Si vous oubliez SAUVEGARDER, la balise d'index sera supprimée de l'index de structure. Allumer SAUVEGARDER, vous empêcherez la suppression de la balise de l'index de la structure.
RENOMMER LA COLONNE FieldName4 EN FieldName5
Permet de changer le nom d'un champ dans une table. Nom du champ4 spécifie le nom du champ qui doit être modifié. Nom du champ5 spécifie un nouveau nom de champ.
Attention Soyez prudent lorsque vous renommez des champs de table, des expressions d'index, des règles de validation de champ et de table, des commandes, des fonctions, etc. peut continuer à faire référence aux anciens noms de champs.
NOVALIDATION
Indique que Visuel FoxPro permet d'apporter des modifications à la structure du tableau qui peuvent violer l'intégrité des données tabulaires. Défaut Visuel FoxPro interdit à l'équipe MODIFIER TABLE apporter des changements aussi destructeurs à la structure. Activation de l'option NOVALIDATION permet de lever cette interdiction.

Équipe MODIFIER TABLE est utilisé pour ajouts, suppression ou modifications colonnes dans une colonne existante tableau.

Commande ALTER TABLE

Équipe MODIFIER TABLE modifie la définition de la table de l'une des manières suivantes :

  • ajoute une colonne
  • ajoute une contrainte d'intégrité
  • remplace une colonne (type de données, taille, valeur par défaut)
  • supprime une colonne
  • modifie les caractéristiques de la mémoire ou d'autres paramètres
  • Active, désactive ou supprime une contrainte d'intégrité ou un déclencheur.

Condition: La table doit être dans le schéma de l'utilisateur, ou l'utilisateur doit disposer des privilèges système MODIFIER N'IMPORTE QUELLE TABLE.

Ajouter une colonne avec une contrainte PAS NUL, développeur ou administrateur Base de données doit prendre en compte un certain nombre de circonstances. Vous devez d'abord créer une colonne sans contrainte, puis saisir des valeurs dans toutes ses lignes. Après que toutes les valeurs des colonnes ne soient plus NUL-valeurs, une contrainte peut lui être appliquée PAS NUL. Si une colonne a une contrainte PAS NUL tente d'ajouter l'utilisateur, un message d'erreur est renvoyé indiquant que soit la table doit être vide, soit la colonne doit contenir une valeur pour chaque ligne existante (rappelez-vous qu'après avoir placé une contrainte sur la colonne PAS NUL ne peut pas y être présent NUL-valeurs dans aucune des lignes existantes). DANS SGBD Oracle Depuis la version 8i, vous pouvez supprimer des colonnes.

Lorsque vous modifiez les types de données de colonnes existantes ou ajoutez des colonnes à une table de base de données, vous devez remplir un certain nombre de conditions. Il est généralement admis qu’augmenter est une bonne chose et que diminuer n’est généralement pas si bon. Augmentations autorisées :

  • Augmentation de la taille des colonnes CARBONISER ou VARCHAR2
  • Augmentation de la taille des colonnes NOMBRE
  • Ajouter de nouvelles colonnes à un tableau

La réduction de diverses caractéristiques de table, notamment certains types de données de colonnes et le nombre réel de colonnes de table, nécessite des considérations particulières. Souvent, avant d'apporter une modification, vous devez vous assurer que toutes les valeurs de la ou des colonnes concernées sont correctes. NUL-des significations. Pour effectuer de telles opérations sur les colonnes du tableau contenant des données, le développeur doit trouver ou créer une sorte de zone pour stocker temporairement ces données. Par exemple, créez une table à l'aide de la commande CRÉER UNE TABLE EN TANT QUE SELECT, qui récupère les données de la clé primaire et de la ou des colonnes en cours de modification. Modifications autorisées :

  • Réduire la taille des colonnes NOMBRE
  • Réduire la taille des colonnes CARBONISER ou VARCHAR2(uniquement avec une colonne vide pour toutes les lignes)
  • Changer le type de données d'une colonne (uniquement si la colonne est vide pour toutes les lignes)

ALTER TABLE Exemple 1

Ajouter une colonne à un tableau :

MODIFIER TABLE t1(pôle1 char(10));

ALTER TABLE Exemple 2

Redimensionner une colonne de tableau :

MODIFIER TABLE t1 MODIFIER(pôle1 char(20));

ALTER TABLE Exemple 3

Suppression d'une colonne de tableau :

MODIFIER TABLE t1 COLONNE DE GOUTTE pôle1 ;

À l'aide de la commande ALTER TABLE, vous pouvez modifier le nom de la table sans transférer réellement les informations physiques vers la base de données :

MODIFIER TABLE t1 RENOMMER EN t2 ;

Une opération similaire peut être effectuée à l'aide de la commande RENAME :

RENOMMER t1 À t2 ;

Les contraintes d'intégrité sur les colonnes et les tables de la base de données peuvent être modifiées, interdites, autorisées et supprimées. Cela donne au développeur la possibilité de créer, modifier et supprimer des règles métier qui restreignent les données. Envisageons d'ajouter des restrictions à la base de données. La simplicité ou la complexité de ce processus dépend de certaines circonstances. Si vous ne parvenez pas à créer une contrainte avec la base de données, le plus simple est de l'ajouter avant de saisir les données :

ALTER TABLE Exemple 4

Modification de la structure du tableau

MODIFIER TABLE t1 MODIFIER(champ1 PAS NUL);

CRÉER UN TABLEAU t2

(champ1 CHAR(10) CLÉ PRIMAIRE);

MODIFIER TABLE t1 AJOUTER

(CONTRAINTE fk_t1 CLÉ ÉTRANGÈRE(champ1)

LES RÉFÉRENCES t2(champ1));

MODIFIER TABLE t1 AJOUTER (UNIQUE(p_nom));

MODIFIER TABLE t1 AJOUTER(p_size CHAR(4) VÉRIFIER

(p_size IN ('P','S','M','L','XL','XXL','XXXL')));

La première commande ci-dessus utilise la clause MODIFY pour ajouter une contrainte NOT NULL sur une colonne, et la clause ADD pour ajouter tous les autres types de contraintes d'intégrité de table. La colonne pour laquelle la contrainte est ajoutée doit déjà exister dans la table de la base de données ; sinon, la contrainte ne sera pas créée.

ALTER TABLE Exemple 5

Pour ajouter des contraintes d'intégrité, vous pouvez omettre le nom de la contrainte que vous créez en utilisant mot-clé CONTRAINTE. Dans ce cas, la commande ressemblera à ceci :

ALTER TABLE t1 AJOUTER UNE CLÉ ÉTRANGÈRE (pôle1) RÉFÉRENCES t2 (pôle1);

Il existe un certain nombre de conditions pour créer des restrictions :

  • Clés primaires : les colonnes ne peuvent pas contenir de valeurs NULL et toutes les valeurs doivent être uniques.
  • Clés étrangères : les colonnes d'autres tables référencées doivent contenir des valeurs qui correspondent à toutes les valeurs des colonnes de référence, ou les valeurs de ces dernières doivent être des valeurs NULL.
  • Contraintes UNIQUES : toutes les valeurs de colonne doivent être des valeurs uniques ou NULL.
  • Contraintes CHECK : la nouvelle contrainte ne s'appliquera qu'aux données ajoutées ou modifiées après leur création.
  • NOT NULL : les valeurs NULL ne sont pas autorisées dans les colonnes.

Les restrictions peuvent être autorisées ou refusées. Une contrainte autorisée remplit ses fonctions en mettant en œuvre des règles métier par rapport aux données saisies dans le tableau, et une contrainte interdite est transférée dans la catégorie des inopérants, comme si elle était supprimée, et ses règles ne sont pas mises en œuvre.

ALTER TABLE Exemple 6

Interdiction des restrictions :

MODIFIER TABLE t1 DÉSACTIVER LA CLÉ PRIMAIRE;
MODIFIER TABLE t1 DÉSACTIVER UNIQUE(p_nom);

ALTER TABLE Exemple 7

Dans certains cas, la désactivation d'une clé primaire dont dépendent les clés étrangères peut poser des problèmes, par exemple :

MODIFIER TABLE t2 DÉSACTIVER CLÉ PRIMAIRE;

Erreur à la ligne 1 : Impossible de désactiver la contrainte…. – des dépendances existent(il est impossible de désactiver une contrainte - il y a des dépendances)

Pour supprimer une clé primaire lorsqu'il existe des clés étrangères qui en dépendent, utilisez la commande ALTER TABLE DISABLE<ограничения>La construction CASCADE est requise :

MODIFIER TABLE t2 DÉSACTIVER CLÉ PRIMAIRE CASCADE;

ALTER TABLE Exemple 8

La restriction interdite est résolue comme suit :

MODIFIER TABLE t1 ACTIVER LA CLÉ PRIMAIRE;

MODIFIER TABLE t1 ACTIVER UNIQUE(p_nom);

Vous ne pouvez autoriser que les restrictions définies précédemment, et dans ce moment interdit.

Une contrainte dont le processus de création a échoué n'existera pas sous une forme interdite, en attente de résolution une fois l'erreur résolue. Généralement, le propriétaire de la table, ou une personne disposant des droits appropriés, peut supprimer la contrainte :

MODIFIER TABLE t1 GOUTTE UNIQUE(p_nom);

Dernière mise à jour : 07/09/2017

À un moment donné, nous souhaiterons peut-être modifier une table existante. Par exemple, ajoutez ou supprimez des colonnes, modifiez les types de colonnes, ajoutez ou supprimez des contraintes. Autrement dit, vous devrez modifier la définition de la table. Pour modifier les tables, utilisez l'instruction ALTER TABLE.

La syntaxe formelle générale de la commande est la suivante :

ALTER TABLE nom_table ( ADD nom_colonne type_données_colonne [attributs_colonne] | DROP COLUMN nom_colonne | ALTER COLUMN nom_colonne type_données_colonne | ADD définition_contrainte | DROP nom_contrainte)

Ainsi, en utilisant ALTER TABLE, nous pouvons réaliser une variété de scénarios de modification de table. Examinons quelques-uns d'entre eux.

Ajout d'une nouvelle colonne

Ajoutons une nouvelle colonne Adresse à la table Clients :

ALTER TABLE Clients ADD Adresse NVARCHAR(50) NULL ;

Dans ce cas, la colonne Adresse est de type NVARCHAR et son attribut NULL est défini. Mais que se passe-t-il si nous devons ajouter une colonne qui ne doit pas accepter les valeurs NULL ? S'il y a des données dans le tableau, alors la commande suivante ne sera pas exécutée :

ALTER TABLE Clients ADD Adresse NVARCHAR(50) NOT NULL ;

Donc dans ce cas la solution est de définir une valeur par défaut via l'attribut DEFAULT :

ALTER TABLE Clients ADD Adresse NVARCHAR(50) NOT NULL DEFAULT "Inconnu" ;

Dans ce cas, s'il y a déjà des données dans le tableau, alors la valeur « Inconnu » sera ajoutée pour la colonne Adresse.

Supprimer une colonne

Supprimons la colonne Adresse de la table Clients :

ALTER TABLE Clients DROP COLUMN Adresse ;

Modification d'un type de colonne

Modifions le type de données de la colonne FirstName de la table Customers en NVARCHAR(200) :

ALTER TABLE Clients ALTER COLUMN Prénom NVARCHAR(200);

Ajout d'une contrainte CHECK

Lorsque vous ajoutez des restrictions, SQL Server vérifie automatiquement les données existantes par rapport aux restrictions ajoutées. Si les données ne respectent pas les restrictions, ces restrictions ne seront pas ajoutées. Par exemple, définissons la colonne Âge de la table Clients sur Âge > 21.

ALTER TABLE Clients AJOUTER CHECK (Âge > 21) ;

S'il y a des lignes dans le tableau dans lesquelles la colonne Age contient des valeurs qui ne répondent pas à cette contrainte, alors la commande sql échouera avec une erreur. Pour éviter ce type de vérification de correspondance et quand même ajouter la contrainte malgré la présence de données qui ne lui correspondent pas, utilisez la clause WITH NOCHECK :

ALTER TABLE Clients AVEC NOCHECK ADD CHECK (Âge > 21) ;

La valeur par défaut est WITH CHECK, qui vérifie les contraintes.

Ajout d'une clé étrangère

Supposons qu'au départ deux tables soient ajoutées à la base de données, sans aucun lien entre elles :

CREATE TABLE Clients (Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE) ; CREATE TABLE Orders (Id INT IDENTITY, CustomerId INT, CreatedAt Date) ;

Ajoutons une contrainte de clé étrangère à la colonne CustomerId de la table Orders :

ALTER TABLE Commandes ADD FOREIGN KEY(CustomerId) REFERENCES Customers(Id);

Ajout d'une clé primaire

A l'aide de la table Orders définie ci-dessus, ajoutez-y une clé primaire pour la colonne Id :

ALTER TABLE Commandes ADD PRIMARY KEY (Id);

Ajout de contraintes de dénomination

Lors de l'ajout de contraintes, nous pouvons leur donner un nom en utilisant l'instruction CONSTRAINT suivie du nom de la contrainte :

ALTER TABLE Commandes ADD CONSTRAINT PK_Orders_Id PRIMARY KEY (Id), CONSTRAINT FK_Orders_To_Customers FOREIGN KEY(CustomerId) REFERENCES Customers(Id); ALTER TABLE Clients ADD CONSTRAINT CK_Age_Greater_Than_Zero CHECK (Age > 0);

Supprimer les restrictions

Pour supprimer les restrictions, vous devez connaître leur nom. Si nous ne connaissons pas exactement le nom de la contrainte, nous pouvons le trouver via SQL Server Management Studio :

En développant le nœud tables dans le sous-nœud Clés, vous pouvez voir les noms des contraintes de clé primaire et étrangère. Les noms de contraintes de clé étrangère commencent par « FK ». Et dans le sous-nœud Contraintes, vous pouvez trouver toutes les contraintes CHECK et DEFAULT. Les contraintes CHECK commencent par "CK" et les contraintes DEFAULT commencent par "DF".

Par exemple, comme vous pouvez le voir sur la capture d'écran, dans mon cas, le nom de la contrainte de clé étrangère dans la table Commandes s'appelle "FK_Orders_To_Customers". Donc pour supprimer une clé étrangère je peux utiliser l'expression suivante :

ALTER TABLE Commandes DROP FK_Orders_To_Customers ;

Si votre projet comporte des tables dont la taille s'élève à des gigaoctets et que pour modifier la structure d'une telle table, vous devez arrêter tous les services pendant plusieurs heures, cet article sera pour vous.

Donné: un tableau de plusieurs dizaines de gigaoctets de données. La tâche est de changer la structure du tableau.

Laissez-moi intervenir directement, la méthode ne fonctionnera que sur les tables transactionnelles. Si vous avez une table MyISAM de plusieurs dizaines de gigaoctets, alors c'est comme dans cette blague : "gérez vous-même vos problèmes". Un exemple sera donné pour une table InnoDB.

Supposons que la structure de notre table ressemble à ceci :

CREATE TABLE `users` (`id` int(11) NON NULL AUTO_INCREMENT, `email` varchar(40) NON NULL PAR DÉFAUT "", `password_hash` char(32) NON NULL PAR DÉFAUT "", `registration_date` int(11) NON NULL PAR DÉFAUT "0", CLÉ PRIMAIRE (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8
Nous souhaitons ajouter le champ last_login à cette table.

Quelles options avons-nous?

De front

ALTER TABLE `users` ADD COLUMN `last_login` int(11) NOT NULL DEFAULT 0 ;
Cette option fonctionne très bien sur les petits projets où la taille de la table dépasse rarement 50 000 enregistrements. L'option ne nous convient pas car... ALTER prendra trop de temps à s'exécuter et pendant tout ce temps, la table sera verrouillée en écriture et en lecture. En conséquence, le service devra être arrêté pendant cette période.

Allume le cerveau

Vous ne pouvez pas toucher du tout à la table, d'ailleurs, mais créer un `users_lastvisits` séparé :
CREATE TABLE `users_lastvisits` (`user_id` int(11) NON NULL, `last_login` int(11) NOT NULL DEFAULT "0", PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Vous pouvez désormais créer un JOIN avec la table last_login dans toutes les requêtes où last_login est nécessaire. Bien sûr, cela fonctionnera plus lentement et l'ajout de JOIN aux requêtes prendra également du temps supplémentaire, mais en général, cela suffit parfois et vous pouvez vous arrêter à ce stade.

Et pourtant, vous devez ajouter un champ

Vous pouvez augmenter la réplication maître-esclave, effectuer ALTER sur le serveur esclave, puis les échanger. Pour être honnête, je n'ai jamais fait cela, c'est peut-être plus simple que la méthode suivante, mais il n'est pas toujours possible d'augmenter la réplication.

Ma méthode est la suivante

Nous créons une nouvelle table avec une structure finale, créons des déclencheurs sur la première table qui enregistreront toutes les modifications, en même temps nous commençons à verser les données de la première table dans la seconde, et une fois terminé, nous « versons » les données modifiées. et renommez les tables.

Nous préparons donc 2 tables - la première avec la structure requise, la seconde pour enregistrer les modifications.
CREATE TABLE `_users` (`id` int(11) NON NULL AUTO_INCREMENT, `email` varchar(40) NON NULL PAR DÉFAUT "", `password_hash` char(32) NON NULL PAR DÉFAUT "", `registration_date` int(11) NON NULL PAR DÉFAUT "0", `lastvisit` int(11) NON NULL PAR DÉFAUT 0, CLÉ PRIMAIRE (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `users_updated_rows` (`id` int(11) NON NULL AUTO_INCREMENT, `row_id` int(11) NON NULL PAR DÉFAUT "0", `action` enum("mis à jour", "supprimé") NON NULL PAR DÉFAUT "mis à jour" , CLÉ PRIMAIRE (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Configurer les déclencheurs :
DÉLIMITEUR ;; CREATE TRIGGER users_after_delete APRÈS DELETE SUR les utilisateurs POUR CHAQUE LIGNE COMMENCE À INSÉRER DANS users_updated_rows VALUES (0, OLD.id, "supprimé"); FIN;; CREATE TRIGGER users_after_insert APRÈS INSERT SUR les utilisateurs POUR CHAQUE LIGNE COMMENCE INSERT INTO users_updated_rows VALUES (0, NEW.id, "mis à jour"); FIN;; CREATE TRIGGER users_after_update APRÈS LA MISE À JOUR SUR LES Utilisateurs POUR CHAQUE LIGNE COMMENCEZ SI (OLD.id != NEW.id) PUIS INSÉREZ DANS LES VALEURS users_updated_rows (0, OLD.id, "supprimé"); FIN SI; INSERT INTO users_updated_rows VALUES (0, NEW.id, "mis à jour"); FIN;; DÉLIMITEUR ;
Maintenant, commençons à verser. Pour ce faire, vous devez ouvrir 2 connexions à la base de données. Dans l'un, il y aura un véritable débordement, dans l'autre, il faudra bloquer brièvement la table pour l'écriture.
mysql> LOCK TABLES utilisateurs ÉCRIRE ; Requête OK, 0 ligne affectée (0,00 sec) mysql> -- les déclencheurs devraient déjà être installés mysql> TRUNCATE users_updated_rows ; Requête OK, 0 ligne affectée (0,17 sec) mysql> -- dans une autre console on démarre le débordement mysql> INSERT INTO _users SELECT id, email, password_hash, Registration_date, 0 FROM users ; mysql> -- encore une fois dans la première console mysql> UNLOCK TABLES ;
Ça y est, maintenant pendant que la table est coulée, nous avons le temps de réfléchir à la manière dont nous allons verser les données qui ont changé depuis le début du coulage. Il n'y a en fait rien de compliqué ici - je ne fournirai pas le script, il vous suffit de prendre un enregistrement à la fois dans la table users_updated_rows dans l'ordre dans lequel ils ont été ajoutés (tri par clé primaire) et de le mettre à jour ou de le supprimer dans le fichier _users. tableau;

Ainsi, le rechargement de la table est déjà terminé, nous devons verser les données restantes. Exécutons le script. Le script doit s'exécuter en permanence et mettre à jour toutes les entrées ajoutées au journal ; lorsqu'il remplit toutes les données, vous devez renommer les tables :
mysql> TRUNCATE users_updated_rows ; Requête OK, 0 ligne affectée (0,16 sec) mysql> RENAME TABLE users TO __users, _users TO users ; Requête OK, 0 ligne affectée (0,11 s)
Il convient de noter qu'à l'heure actuelle, une légère perte de données est possible. les requêtes ne sont pas exécutées de manière atomique. Si cela est critique, il est préférable de désactiver le service pendant un certain temps afin qu'il n'y ait aucune demande de modification. Vous pouvez, par exemple, retirer les droits d'écriture d'un utilisateur et exécuter des commandes sous un autre utilisateur.

Si tout est fait correctement, aucune donnée ne sera perdue et il n'y aura pratiquement aucune interruption du service. C’est exactement ce dont nous avions besoin. De la même manière, vous pouvez transférer des données vers un autre serveur, seule la méthode de transfert changera. Au lieu de
mysql> INSERT INTO _users SELECT id, email, password_hash, Registration_date, 0 FROM utilisateurs ;
vous devez verser via mysqldump :
$ mysqldump -h host1 utilisateurs de la base de données --single-transaction -ecQ | PV | mysql -h hôte2
De cette façon, j'ai pu transférer une table de 60 Go et 400 millions de lignes vers un autre serveur sans arrêter le fonctionnement des services en 12 heures environ.

D'ailleurs, le vélo a déjà été inventé par Facebook et s'appelle