Database
 sql >> Base de données >  >> RDS >> Database

SQL ALTER TABLE pour les débutants

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 exemple ADD suivi du nom de la colonne et de sa définition, ou DROP 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.