[解決済み] mysql テーブルにカラムが存在しない場合、カラムを追加する。
質問
調査や実験の結果、まだ答えが出ていませんので、ご教示いただければと思います。
私は、以前のバージョンでは、現在追加したい列がなかったアプリケーションのインストール ファイルを変更しています。手動で列を追加するのではなく、インストール ファイルで、新しい列がテーブルにまだ存在しない場合にのみ、列を追加したいのです。
テーブルは次のように作成されます。
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'
エラーをキャッチして、アップグレードスクリプトで無視する。
関連
-
MySql認証ベースのvsftpd仮想ユーザー
-
MySQLによる既存テーブルのパーティショニングの実装
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
SQLException。オペランドは1列でなければなりません。
-
[解決済み] Ubuntu linux上で動作するリモートMySQLサーバーを再起動する方法は?
-
[解決済み] カラムの変更:NULLをNOT NULLに変更する
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] MySQLで特定のカラムの後に複数のカラムを追加する
-
[解決済み】既存テーブルへの外部キー追加
-
[解決済み] MySQLのテーブルを変更し、カラムにコメントを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQLとOracleの一括挿入SQLの汎用的な記述例
-
MySQL インタビューの質問 - ハッシュインデックスを設定する方法
-
[解決済み】SQLサーバーのテンポラリーテーブルで「すでに名前のついたオブジェクトがあります」エラーが発生する。
-
Djangoマイグレーションエラー 外部キー制約を追加できない
-
mysql がエラーを報告します。不明な文字セットです。'utf8mb4'
-
[解決済み] INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINの違いは何ですか?[重複しています]。
-
[解決済み] SQLでカラムに最大値を持つ行のみを選択する [重複]。
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?