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

列が存在しない場合は、mysqlテーブルに列を追加します

    これが実用的な解決策です(Solaris上のMySQL 5.0で試してみました):

    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS upgrade_database_1_0_to_2_0 $$
    CREATE PROCEDURE upgrade_database_1_0_to_2_0()
    BEGIN
    
    -- rename a table safely
    IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
            AND TABLE_NAME='my_old_table_name') ) THEN
        RENAME TABLE 
            my_old_table_name TO my_new_table_name,
    END IF;
    
    -- add a column safely
    IF NOT EXISTS( (SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE()
            AND COLUMN_NAME='my_additional_column' AND TABLE_NAME='my_table_name') ) THEN
        ALTER TABLE my_table_name ADD my_additional_column varchar(2048) NOT NULL DEFAULT '';
    END IF;
    
    END $$
    
    CALL upgrade_database_1_0_to_2_0() $$
    
    DELIMITER ;
    

    一見すると、おそらく必要以上に複雑に見えますが、ここでは次の問題に対処する必要があります。

    • IF ステートメントはストアドプロシージャでのみ機能し、直接実行された場合は機能しません。 mysqlクライアントで
    • よりエレガントで簡潔なSHOW COLUMNS ストアドプロシージャでは機能しないため、INFORMATION_SCHEMAを使用する必要があります
    • MySQLではステートメントを区切る構文がおかしいため、ストアドプロシージャを作成できるようにするには、区切り文字を再定義する必要があります。区切り文字を元に戻すことを忘れないでください!
    • INFORMATION_SCHEMAはすべてのデータベースに対してグローバルです。TABLE_SCHEMA=DATABASE()でフィルタリングすることを忘れないでください。 。 DATABASE() 現在選択されているデータベースの名前を返します。


    1. asp.netのSQLサーバーデータベースからの画像を表示するための最良の方法は何ですか?

    2. MySqlの保護されたキーワードと同じ名前を共有するテーブルのSQLを作成するにはどうすればよいですか?

    3. データベースプロバイダータイプごとに許可されるパラメーターの最大数はいくつですか?

    4. LATERAL JOINとPostgreSQLのサブクエリの違いは何ですか?