> For the complete documentation index, see [llms.txt](https://docs.glassworks.tech/sgbdr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.glassworks.tech/sgbdr/data-definition-ddl/010-alter-table.md).

# Alter table

Souvent on est amené à modifier le schéma de notre base de données :

* suite à une évolution dans notre business
* suite à des constats après l'utilisation de la base
* etc.

On n'a pas le choix de supprimer la base et recommencer, il faut la modifier.

Il y a plusieurs interventions possibles.

Dans ce chapitre, on démontre un certain nombre d'opérations possibles. Attention, la syntaxe précis peut changer d'un SGBDR à l'autre.

## Supprimer une table

On peut supprimer une table avec `drop table`:

```sql
drop table film_actor;
```

Si la table contient des références par clé étrangère (d'autres tables qui pointent vers cette table), le `drop table` ne sera pas autorisé.

{% hint style="warning" %}
Faites attention à bien accorder des bons privilèges ! La commande `drop` devrait toujours être soigneusement accordée !
{% endhint %}

## Ajouter une colonne

```sql
alter table films add (
  release_year int NOT NULL
);
```

## Supprimer une colonne

```sql
alter table films drop release_year;
```

Si la colonne est une clé étrangère (d'autres tables qui pointent vers cette table), le `drop` ne sera pas autorisé.

## Ajouter une contrainte sur une colonne

```sql
alter table films 
modify column title varchar(256) NOT NULL default "Unknown film";
```

{% hint style="warning" %}
Si vous avez déjà des données, et ensuite, vous rajoutez une contrainte, si les données existantes ne respectent pas la nouvelle contrainte, la commande va échouer !
{% endhint %}

## Modifier une clé primaire

```sql
/* D'abord supprimer la clé primaire existante */
alter table film_actor drop primary key;
/* Ensuite, la rajouter */
alter table film_actor add primary key (film_id, actor_id);
```

## Migrations

Souvent il faut implémenter une modification à une base qui implique aussi une correction des données (pour satisfaire la nouvelle contrainte), ou bien l'enlèvement temporaire d'une contrainte, et puis sa remise après l'opération.

Un ensemble d’instructions SQL qui permettent de changer la structure d’une table ou base s'appelle une **migration**.

Par exemple :

* Un ensemble de requêtes des types `UPDATE` afin de rendre les données conforme à la nouvelle contrainte qui arrivera
* Ensuite la requête de type `ALTER TABLE` pour imposer la contrainte

{% hint style="success" %}
N'oubliez pas de sauvegarder votre base de données avant d'exécuter votre migration !
{% endhint %}
