Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zmodyfikuj wszystkie kolumny w tabeli, aby „nie były puste” bez względu na wszystko

Szybkim sposobem jest zapisanie instrukcji alter w pliku

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

Następnie uruchom zawartość pliku

source /tmp/alter.txt

i gotowe...

Przetestowałem to w bazie danych placu zabaw i zadziałało dla mnie, ale nadal możesz chcieć dwukrotnie sprawdzić plik przed uruchomieniem :)

P.S.:Nie sprawdziłem, jak obsługiwane są wartości NULL. IIRC musisz mieć domyślną wartość? Nie jestem teraz pewien. Przetestuj to przed użyciem.

EDYCJA 1:Aby mieć jedną instrukcję na 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

EDYCJA 2:

Ten działa

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

, ale group_concat() ma ograniczoną długość, więc jeśli w tabeli jest zbyt wiele kolumn, mogą wystąpić błędy składni. Wtedy nadal masz pierwszą opcję z góry lub spójrz na ten wpis ręczny :

SET [GLOBAL | SESSION] group_concat_max_len = val;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. utwórz pokaz slajdów z obrazów wewnątrz modalnego ładowania początkowego dynamicznie za pomocą PHP

  2. mysql error 2049 połączenie przy użyciu starego (przed 4-1-1) uwierzytelnienia z mac

  3. Próbuję wykonać LOAD DATA INFILE za pomocą REPLACE i AUTO_INCREMENT

  4. usuń zduplikowane wiersze na podstawie wartości jednej kolumny

  5. Jedna tabela, dwie kolumny dla zapytania MYSQL