sql >> Databasteknik >  >> RDS >> Mysql

Ändra alla kolumner i en tabell till "inte null" oavsett vad

Ett snabbt sätt är att skriva dina alter-satser i en fil

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

Kör sedan filens innehåll

source /tmp/alter.txt

och du är klar...

Testade det i en lekplats-DB och det fungerade för mig, ändå kanske du vill dubbelkolla filen innan du kör :)

P.S.:Jag har inte kontrollerat hur NULL-värden hanteras. IIRC måste du ha ett standardvärde? Inte säker just nu. Testa detta innan du använder det.

EDIT 1:För att ha en sats per tabell:

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:

Den här fungerar

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

, men group_concat() är begränsad i längd, så du kan få syntaxfel om du har för många kolumner i en tabell. Då har du fortfarande det första alternativet från ovan, eller så tittar du på denna manuella post :

SET [GLOBAL | SESSION] group_concat_max_len = val;



  1. PostgreSQL:Fulltextsökning - Hur söker man i delord?

  2. WooCommerce serialiserad metavärdesmatris i wp_postmeta-tabellen

  3. Beräkna procentandelen av roten som ägs av dess föräldrar

  4. Få modifierade förbeställningsträdövergångsdata till en array