實際專案中經常需要編寫資料庫公升級指令碼來做一些基本的表操作:如新增表、新增字段,修改欄位等。由於環境部署會經常執行公升級指令碼,編寫可重複執行的公升級指令碼就很重要。
基本思路是對錶做操作前先判斷表是否存在,對字段做操作前同樣需要判斷字段是否已經存在,避免指令碼執行過程報錯退出。下面基於指令碼可重複執行的要求,給了一些常用的資料庫公升級指令碼編寫樣例:
drop table if exists tbl_user;
create table tbl_user (
id int(11) not null auto_increment,
name varchar(255) not null default '',
age int(4) not null default '0',
primary key (`id`)
) engine=innodb auto_increment=10 default charset=utf8;create procedure add_tbl_user_name_en()
begin
if not exists (select 1 from information_schema.columns
where table_name='tbl_user'
and table_schema='testdb3'
and column_name='name_en')
then
alter table tbl_user add column name_en varchar(255) not null default '' comment '英文名';
end if;
end;
call add_tbl_user_name_en;
drop procedure add_tbl_user_name_en;如何判斷表中的字段是否已經存在?在mysql中沒有什麼簡便的方法,筆者通過乙個儲存過程來做判斷,處理完後再刪除儲存過程。
create procedure change_tbl_user_name_en_to_name_cn()
begin
if exists (select 1 from information_schema.columns
where table_name='tbl_user'
and table_schema='testdb3'
and column_name='name_en')
then
alter table tbl_user change name_en name_cn varchar(255) not null default '' comment '中文名';
end if;
end;
call change_tbl_user_name_en_to_name_cn;
drop procedure change_tbl_user_name_en_to_name_cn;create procedure delete_tbl_user_name()
begin
if exists (select 1 from information_schema.columns
where table_name='tbl_user'
and table_schema='testdb3'
and column_name='name')
then
alter table tbl_user drop name;
end if;
end;
call delete_tbl_user_name;
drop procedure delete_tbl_user_name;同樣,建庫,建索引也需要提前判斷庫或者索引是否已經存在,避免重複建立。
資料庫公升級時也會有一些靜態的配置資料要預置到資料庫表中。在插入這些資料前需要執行一下delete或者truncate table清除資料,避免多次執行指令碼後插入重複資料。
一般來說,一台mysql伺服器上會有多個db,每個db都會有自己的公升級指令碼。為了方便公升級指令碼自動化執行,在公升級指令碼前面需要加上」use testdb3」, 用於指定是對testdb3資料庫操作。
MySQL 的可重複讀
我在這裡分享一篇關於 mysql 的可重複讀介紹,講得挺好的,可以解決一些疑惑,鏈結在下方引用處。sql 1992 年標準關於幻讀 phantom 的解釋 乙個事務 t1 根據某些查詢條件 讀取某幾行資料,然後事務 t2 執行 sql 語句插入一行或多行滿足查詢條件 的資料 這時候如果事務 t1 重...
mysql 可重複讀。
一 可重複讀 我們先看看現象,再分析原理。我的mysql版本是5.5。下面是一張表,只有一條資料,並且我開啟了事物 此時,另乙個事物將record加1,因此我在開啟乙個命令列客戶端,執行下面的命令 成功加1之後,實際上,資料庫中record肯定是2。然後回到之前的客戶端,再查一次 沒毛病,recor...
mysql可重複讀
mysql innodb的預設隔離級別是可重複讀,之前理解有些偏差,查閱一些資料後總結出幾點 首先有兩個概念 一致性檢視 當乙個事務開啟時,innodb會生成乙個檢視,這個檢視是邏輯檢視,通過undo log和row tranzaction id控制實現。在該事務的任何時間點,一致性檢視中的資料都是...