sql >> Database >  >> RDS >> Mysql

Wijzig alle kolommen in een tabel in 'niet null', wat er ook gebeurt

Een snelle manier is om uw alter-statements in een bestand te schrijven

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';

Voer vervolgens de inhoud van het bestand uit

source /tmp/alter.txt

en je bent klaar...

Getest in een speeltuin-DB en het werkte voor mij, toch wil je het bestand misschien nog een keer controleren voordat je het uitvoert :)

P.S.:Ik heb niet gecontroleerd hoe NULL-waarden worden verwerkt. IIRC moet je een standaardwaarde hebben? Weet het nu niet zeker. Test dit voordat u het gebruikt.

EDIT 1:Om één verklaring per tabel te hebben:

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

EDIT 2:

Deze werkt

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

, maar group_concat() is beperkt in lengte, dus u kunt syntaxisfouten krijgen als u te veel kolommen in een tabel heeft. Dan heb je nog de eerste optie van hierboven, of je kijkt op deze handmatige invoer :

SET [GLOBAL | SESSION] group_concat_max_len = val;



  1. Update colPos met typo3-extensie flux 9.0.1

  2. MySQL Tinybit(1)-kolom door een weergave

  3. Log waarschuwingen in een tabel

  4. Kan MySQL AUTO_INCREMENT niet wijzigen