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

他のメタデータを失うことなくMySQLの列データ型を変更します(DEFAULT、NOTNULL ...)

    マニュアルページ に記載されているとおり 、ALTER TABLE すべての新しいタイプ属性を定義する必要があります。

    ただし、これを克服する方法があります。 INFORMATION_SCHEMAを使用できます メタデータ 目的のALTERを再構築します クエリ。たとえば、単純なテーブルがある場合:

    mysql> DESCRIBE t;
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
    | value | varchar(255)     | NO   |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    2 rows in set (0.01 sec)
    

    次に、次のように変更ステートメントを再現できます。

    SELECT 
      CONCAT(
        COLUMN_NAME, 
        ' @new_type', 
        IF(IS_NULLABLE='NO', ' NOT NULL ', ' '), 
        EXTRA
      ) AS s
    FROM 
      INFORMATION_SCHEMA.COLUMNS 
    WHERE 
      TABLE_SCHEMA='test' 
      AND 
      TABLE_NAME='t'
    

    結果は次のようになります:

    +--------------------------------------+
    | s                                    |
    +--------------------------------------+
    | id @new_type NOT NULL auto_increment |
    | value @new_type NOT NULL             |
    +--------------------------------------+
    

    ここに@new_typeを残しました そのために変数を使用できることを示します(または、新しいタイプを直接クエリに置き換えます)。次のような変数を使用します:

    • 変数を設定します。

      mysql> SET @new_type := 'VARCHAR(10)', @column_name := 'value';
      Query OK, 0 rows affected (0.00 sec)
      
    • プリペアドステートメント の変数を準備します (長いクエリですが、上記の説明を残しました):

      SET @sql = (SELECT CONCAT('ALTER TABLE t CHANGE `',COLUMN_NAME, '` `', COLUMN_NAME, '` ', @new_type, IF(IS_NULLABLE='NO', ' NOT NULL ', ' '), EXTRA) AS s FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t' AND [email protected]_name);
      
    • ステートメントの準備:

      mysql> prepare stmt from @sql;
      Query OK, 0 rows affected (0.00 sec)
      Statement prepared
      
    • 最後に、それを実行します:

      mysql> execute stmt;
      Query OK, 0 rows affected (0.22 sec)
      Records: 0  Duplicates: 0  Warnings: 0
      

    次に、データ型をVARCHAR(10)に変更します 残りのすべての指定子を保存して:

    mysql> DESCRIBE t;
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
    | value | varchar(10)      | NO   |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    


    1. MySQL-大きなデータベースからいくつかの特定のテーブルを削除する

    2. アプリケーションを開始してからしばらくすると、ningx、uwsgi、pythonの永続的なmysqlエラーが発生します

    3. current_timestamp()がPostgreSQLでどのように機能するか

    4. Postgresの列名またはテーブル名に引用符が必要なのはいつですか。