Un moyen rapide consiste à écrire vos instructions alter dans un fichier
select
concat('ALTER TABLE ', c.TABLE_NAME, ' CHANGE ', c.COLUMN_NAME, ' ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL;') as alter_statement
into outfile '/tmp/alter.txt'
from information_schema.COLUMNS c
where
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'your_database_name';
Exécutez ensuite le contenu du fichier
source /tmp/alter.txt
et le tour est joué...
Testé dans une base de données de terrain de jeu et cela a fonctionné pour moi, mais vous voudrez peut-être revérifier le fichier avant de l'exécuter :)
P.S. :Je n'ai pas vérifié comment les valeurs NULL sont gérées. IIRC tu dois avoir une valeur par défaut ? Pas sûr pour le moment. Veuillez le tester avant de l'utiliser.
EDIT 1 :Pour avoir une déclaration par table :
select
concat('ALTER TABLE ', c.TABLE_NAME, GROUP_CONCAT(' MODIFY COLUMN ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL')) as alter_statement
from information_schema.COLUMNS c
where
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'your_database_name'
group by c.TABLE_NAME
ÉDITION 2 :
Celui-ci fonctionne
select concat(alter_statement, ';')
into outfile '/tmp/alter.txt'
from (
select
concat('ALTER TABLE ', c.TABLE_NAME, GROUP_CONCAT(' CHANGE ', c.COLUMN_NAME, ' ', c.COLUMN_NAME, ' ', c.COLUMN_TYPE, ' NOT NULL')) as alter_statement
from information_schema.COLUMNS c
where
c.IS_NULLABLE = 'YES'
and c.TABLE_SCHEMA = 'playground'
group by c.TABLE_NAME
) sq
, mais group_concat()
est limité en longueur, vous risquez donc d'obtenir des erreurs de syntaxe si vous avez trop de colonnes dans une table. Ensuite, vous avez toujours la première option ci-dessus, ou vous jetez un œil à cette entrée manuelle
:
SET [GLOBAL | SESSION] group_concat_max_len = val;