1. ホーム
  2. mysql

[解決済み] mysql テーブルにカラムが存在しない場合、カラムを追加する。

2022-10-18 17:33:32

質問

調査や実験の結果、まだ答えが出ていませんので、ご教示いただければと思います。

私は、以前のバージョンでは、現在追加したい列がなかったアプリケーションのインストール ファイルを変更しています。手動で列を追加するのではなく、インストール ファイルで、新しい列がテーブルにまだ存在しない場合にのみ、列を追加したいのです。

テーブルは次のように作成されます。

CREATE TABLE IF NOT EXISTS `#__comm_subscribers` (
      `subscriber_id` int(11) NOT NULL auto_increment,
      `user_id` int(11) NOT NULL default '0',
      `subscriber_name` varchar(64) NOT NULL default '',
      `subscriber_surname` varchar(64) NOT NULL default '',
      `subscriber_email` varchar(64) NOT NULL default '',
      `confirmed` tinyint(1) NOT NULL default '0',
      `subscribe_date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`subscriber_id`),
      UNIQUE KEY `subscriber_email` (`subscriber_email`)
    ) ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT='Subscribers for Comm are stored here.';

テーブルの作成ステートメントの下に、以下を追加した場合、カラムがすでに存在する(そしておそらく入力されている)場合、何が起こるのかよくわかりません。

ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';

そこで、どこかで見つけた次のようなものを試してみました。これはうまくいかないようですが、私が適切に使用したかどうか全く自信がありません。

/*delimiter '//'
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='subscriber_surname' AND TABLE_NAME='#__comm_subscribers'
)
THEN
    ALTER TABLE `#__comm_subscribers`
    ADD COLUMN `subscriber_surname` varchar(64) NOT NULL default '';
END IF;
END;
//
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;*/

どなたか良い方法をご存じないでしょうか?

どのように解決するのですか?

以下のことに注意してください。 INFORMATION_SCHEMA は 5.0 より前の MySQL ではサポートされていないことに注意してください。 また、ストアドプロシージャも 5.0 より前のものはサポートされていないので、MySQL 4.1 をサポートする必要がある場合、この解決策は良くありません。

を使用するフレームワークで使用される 1 つの解決策は データベース マイグレーション を使用するフレームワークによって使用される1つの解決策は、データベースにスキーマのリビジョン番号を記録することです。 1 つのカラムと 1 つの行からなるテーブルで、現在有効なリビジョンを示す整数を指定します。 スキーマを更新するときは、この番号をインクリメントします。

別の解決策としては、単に を試すことです。 ALTER TABLE ADD COLUMN コマンドを試してみてください。 カラムがすでに存在する場合は、エラーを投げるはずです。

ERROR 1060 (42S21): Duplicate column name 'newcolumnname'

エラーをキャッチして、アップグレードスクリプトで無視する。