sql >> データベース >  >> RDS >> Mysql

テーブル内のすべての列を「nullではない」に変更します。

    手っ取り早い方法は、alterステートメントをファイルに書き込むことです

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

    次に、ファイルのコンテンツを実行します

    source /tmp/alter.txt
    

    完了です...

    プレイグラウンドDBでテストしたところ、うまくいきましたが、実行する前にファイルを再確認することをお勧めします:)

    追伸:NULL値の処理方法を確認していません。 IIRCデフォルト値が必要ですか?今はわかりません。使用する前にこれをテストしてください。

    編集1:テーブルごとに1つのステートメントを作成するには:

    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
    

    編集2:

    これは機能します

    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
    

    、ただしgroup_concat() は長さが制限されているため、テーブルの列が多すぎると構文エラーが発生する可能性があります。次に、上記の最初のオプションがまだあります。または、この手動エントリ

    SET [GLOBAL | SESSION] group_concat_max_len = val;
    



    1. SQLDeveloperでのSQLステートメントの調整

    2. mysqlのテーブルから重複する行を削除する方法

    3. パスに許可を与える

    4. FULLOUTERJOINを使用せずに条件付きで列にグループ化する方法