2017-03-03 8 views
0

私はローカルデータベースを使用するプログラムを持っています。ユーザーは異なるバージョンのプログラムを持っていて、そのプログラムはデータベースを更新するコマンドを持っています。だから今、私はのようなコードのこの巨大なブロックがあります。私はなど、インデックスを作成し、テーブルを追加、追加または列を削除これらの数百を持っている行ごとに行なわずにmysqlスキーマを確認できます

try 
{ 
    using (var cmd = new MySqlCommand("ALTER TABLE `SomeTable` ADD COLUMN `SomeColumn` double NULL ;", con)) 
       { 
        cmd.CommandType = CommandType.Text; 
        cmd.ExecuteNonQuery(); 
       } 
} 

をこれを行うには、より効率的な方法はあります、のような一度にスキーマ全体を確認するか、それを維持していますか? 私はそれを文字列の配列に変更し、配列内のすべての文字列を実行するつもりですが、これを行うより良い方法があるかどうかはわかりませんでした。

答えて

1

データベースinformation_schemaからデータベース内のスキーマ全体を一度に照会することができます。したがって、1つのクエリですべての列設定を確認できます。結果を解析して、必要な更新を確認することができます。 (データベースinformation_schemaは、MySQLに特異的である):

SELECT * FROM `information_schema`.`COLUMNS` WHERE TABLE_SCHEMA = "<your_database>" 

将来のためにそれが簡単に維持ANデータベース内dbversionのようなテーブルを作成します。このテーブルはデータベースバージョンを任意の文字列(たとえば "1.1.2")で保持しており、このデータベースで更新が行われた日付を保持しています。したがって、データベースがどのスキーマバージョンであるかを照会し、必要に応じて更新を行うことができます。

すべての更新が正常に実行された場合にのみ、このデータベースの更新を行います。別の方法は、更新が進行中であるセマフォとして更新の前にデータセットを挿入することです。

など。 version = "1.1.3 update"となり、更新が成功した後、この追加された行を削除し、version = "1.1.3"を追加します。

CREATE TABLE `dbversion` (
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `version` varchar(50) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

ALTER TABLE `dbversion` 
    ADD PRIMARY KEY (`date`,`version`), 
    ADD KEY `date` (`date`); 

dbversionのある最新のエントリを取得:

SELECT * FROM `dbversion` ORDER BY `date` DESC LIMIT 1; 
関連する問題