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

Modifier toutes les colonnes d'une table en 'not null' quoi qu'il arrive

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;