sql >> Database teknologi >  >> RDS >> Mysql

Rediger alle kolonner i en tabel til 'ikke null' uanset hvad

En hurtig måde er at skrive dine alter-udsagn ind 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';

Udfør derefter filens indhold

source /tmp/alter.txt

og du er færdig...

Testede det i en legeplads-DB, og det virkede for mig, men du vil måske gerne dobbelttjekke filen, før du udfører :)

P.S.:Jeg har ikke tjekket, hvordan NULL-værdier håndteres. IIRC skal du have en standardværdi? Ikke sikker lige nu. Test dette, før du bruger det.

EDIT 1:For at have én sætning pr. tabel:

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:

Denne virker

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() er begrænset i længden, så du kan få syntaksfejl, hvis du har for mange kolonner i en tabel. Så har du stadig den første mulighed fra oven, eller du har et kig på denne manuelle indtastning :

SET [GLOBAL | SESSION] group_concat_max_len = val;



  1. Sådan installeres Oracle SQL Developer 18.2 på Windows 10?

  2. postgres bruger kun sorteret indeks til forespørgsel på 5m posttabel

  3. Kan ikke slippe en MySQL-tabel på grund af fremmednøglebegrænsninger

  4. En-til-mange relationer i (Postgre)SQL