En SQL, le ALTER TABLE
L'instruction modifie la définition d'une table existante.
Vous pouvez utiliser ALTER TABLE
pour modifier, ajouter ou supprimer des colonnes et des contraintes.
Selon votre SGBD, la commande ALTER TABLE
peut également être utilisée pour réaffecter et reconstruire des partitions, ou désactiver et activer des contraintes et des déclencheurs.
Syntaxe
Le ALTER TABLE
l'énoncé se présente généralement comme suit :
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Où :
table_name
est le nom de la table que vous souhaitez modifier.[alter_option [, alter_option] …]
est une liste des modifications spécifiques que vous souhaitez apporter (par exempleADD
suivi du nom de la colonne et de sa définition, ouDROP COLUMN
suivi du nom de la colonne, etc.).[partition_options]
est une liste facultative d'options spécifiques aux tables partitionnées. Tous les SGBD ne prennent pas en charge les tables partitionnées. Si c'est le cas, ces options peuvent vous permettre d'ajouter, de supprimer, de supprimer, d'importer, de fusionner ou de diviser des partitions, ou d'effectuer la maintenance du partitionnement.
La syntaxe complète pour ALTER TABLE
peut être assez complexe et varie considérablement d'un SGBD à l'autre. Pour tout ce qui n'est pas couvert dans cet article, consultez la documentation de votre SGBD.
Vous trouverez ci-dessous des exemples des ALTER TABLE
les plus courants opérations.
Ajouter une nouvelle colonne
Pour ajouter une nouvelle colonne à une table, utilisez le ADD
clause, suivi du nom de la colonne et du type de données.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Cela ajoute une nouvelle colonne appelée ProductDescription
aux Products
tableau.
Dans cet exemple, nous avons fait de la colonne un varchar(500)
mais vous utiliseriez le type de données approprié pour votre nouvelle colonne.
Vous pouvez également inclure des contraintes dans votre définition de colonne, mais cela peut dépendre de votre SGBD et si oui ou non la table contient déjà des données (voir la discussion ci-dessous à ce sujet).
Renommer une colonne
La plupart des principaux SGBDR (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) vous permettent de renommer une colonne comme ceci :
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Si vous utilisez MySQL avant la version 8.0 ou MariaDB avant la version 10.5.2+, vous devrez utiliser le CHANGE COLUMN
syntaxe à la place, qui vous oblige également à respécifier le type de données. Comme ceci :
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
Dans SQL Server, vous devrez utiliser le sp_rename
procédure stockée pour renommer une colonne. Comme ceci :
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Supprimer une colonne
Pour supprimer une colonne, utilisez le DROP COLUMN
clause, suivi du nom de la colonne.
ALTER TABLE table_name
DROP COLUMN column_name;
Modifier la définition d'une colonne
La syntaxe de modification de la définition d'une colonne existante varie considérablement d'un SGBD à l'autre. Cela dépend aussi des modifications que vous devez apporter.
Pour simplifier les choses, modifions simplement une colonne dans SQL Server :
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
Dans cet exemple, nous avons modifié le ProductDescription
colonne de varchar(500)
à varchar(1000)
.
Ce qui suit montre la syntaxe de base requise par chaque SGBD pour effectuer des modifications identiques ou similaires.
SQL Server :
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL :
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB et Oracle avant 10g :
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
Dans Oracle 10g et versions ultérieures :
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite ne vous laissera pas modifier une colonne, sauf pour la renommer.
La syntaxe réelle de chaque SGBD est généralement beaucoup plus complexe que cela et dépend exactement de ce que vous essayez de faire. Cependant, cela devrait vous permettre de commencer avec les modifications de base des colonnes.
Restrictions et considérations
Vous devez généralement éviter d'apporter des modifications aux tables une fois qu'elles contiennent des données. En apportant des modifications, vous courez le risque de perdre des données existantes.
Cela dit, de nombreux SGBD vous empêchent en fait d'apporter certaines modifications une fois qu'une table contient des données. Par exemple, vous pourriez constater que vous ne pouvez pas ajouter un NOT NULL
contrainte à une colonne qui contient des données.
Certains SGBD peuvent vous permettre de le faire, tant que vous utilisez un DEFAULT
contrainte (pour fournir une valeur par défaut pour les colonnes dans lesquelles aucune donnée n'a été explicitement insérée), ou une colonne d'identité/auto-incrémentation, ou une colonne d'horodatage, etc.
Certains SGBD ne vous permettent pas de supprimer ou de modifier des colonnes dans une table.
De plus, certains SGBD restreignent les types de données pouvant être ajoutés.
Exemple – Ajout d'une contrainte NOT NULL
Voici un exemple pour aider à démontrer les points ci-dessus.
Voici ce qui se passe lorsque j'essaie d'ajouter une colonne avec un NOT NULL
contrainte dans SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Résultat :
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
Fondamentalement, la table contient déjà des données, et donc SQL Server renvoie une erreur qui me dit que je ne peux ajouter qu'un NOT NULL
contrainte si la table satisfait à certains critères, et qu'elle ne satisfait pas encore à ces critères.
Et il y a une bonne raison à ce critère.
Un NOT NULL
la contrainte garantit qu'il n'y a pas de NULL
valeurs dans la colonne de n'importe quelle ligne. Le problème est que nous avons déjà des données dans la table, et si nous ajoutons une nouvelle colonne, ces lignes existantes seront NULL
– qui violera immédiatement notre NOT NULL
contrainte. Nous devons donc spécifier les données à insérer dans les lignes existantes.
Pour ce faire, nous pouvons ajouter un DEFAULT
contrainte ou similaire pour garantir que toutes les lignes existantes sont automatiquement remplies avec des données dans cette colonne.
Exemple :
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Cela ajoute simplement un DEFAULT
contrainte à la colonne. Cette contrainte garantit que toutes les lignes contiennent une valeur (dans ce cas, la valeur est N/A
) si aucune valeur ne leur a été attribuée. Cela signifie que notre NOT NULL
contrainte ne sera pas violée, car toutes les lignes existantes contiendront désormais une valeur.
Si la nouvelle colonne doit avoir des valeurs uniques et incrémentielles, vous pouvez à la place en faire une IDENTITY
colonne (ou AUTOINCREMENT
dans SQLite et d'autres SGBD).
Toutefois, si le tableau ne contient pas déjà de données, vous pourrez peut-être ajouter la colonne sans avoir à effectuer aucune de ces étapes.
Options de partition
Cet article est destiné aux débutants, et les tables partitionnées sortent un peu du domaine du didacticiel pour débutants.
Cela dit, je vais passer rapidement en revue certaines des options de partitionnement en ce qui concerne ALTER TABLE
déclaration.
Si votre SGBD prend en charge les tables partitionnées, il fournit probablement également des options de partition avec le ALTER TABLE
déclaration.
Par exemple, dans MySQL, vous pouvez effectuer les opérations suivantes :
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Cela partitionne la table en 8 partitions, par HASH
, en utilisant le ProductId
colonne comme clé de partitionnement.
PARTITION BY HASH
utilise le reste de l'expression (dans ce cas, le ProductId
colonne) divisé par le nombre de partitions (c'est-à-dire le module).
Vous pouvez également utiliser des partitions de plage. Voici comment ajouter une partition de plage à une table existante :
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Cet exemple implique que les Products
table a déjà 8 partitions de plage, et nous ajoutons une autre partition appelée Partition9
.
Vous pouvez supprimer des partitions comme ceci :
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Gardez à l'esprit que ces exemples sont pour MySQL.
J'ai également écrit quelques articles concernant les tables partitionnées dans SQL Server. En ce qui concerne la ALTER TABLE
, voici comment basculer une partition et voici comment basculer dans une partition (les deux se font avec ALTER TABLE
).
Dans SQL Server, certaines options de partition doivent être effectuées avec d'autres instructions. Par exemple, la fusion des partitions se fait avec la ALTER PARTITION FUNCTION
et le fractionnement des partitions se fait avec le ALTER PARTITION SCHEME
déclaration.
Si vous souhaitez en savoir plus sur les tables partitionnées dans SQL Server, voici comment créer une table partitionnée dans SQL Server.
ALTER TABLE
en SQLite
Je dois également mentionner que SQLite a un support très limité de ALTER TABLE
déclaration. Dans SQLite, le ALTER TABLE
vous permet de renommer une table, de renommer une colonne dans une table ou d'ajouter une nouvelle colonne à une table existante.
Toute autre modification vous obligera à supprimer la table et à recommencer. Cela s'applique également à l'ajout de clés étrangères.