命令語法如下
成都創(chuàng)新互聯(lián)公司專注于從江企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城建設(shè)。從江網(wǎng)站建設(shè)公司,為從江等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站建設(shè),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
create table 表名(列名稱 數(shù)據(jù)類型 default 默認(rèn)值);
修改數(shù)據(jù)庫表的列默認(rèn)值
命令行界面
若本身存在默認(rèn)值,則先刪除
alter table表名alter column字段名drop default;
然后設(shè)置默認(rèn)值(若本身不存在則可以直接設(shè)定)
alter table表名 alter column字段名 set default默認(rèn)值;
再次返回表的結(jié)構(gòu)視圖,你會發(fā)現(xiàn)如下圖。剛剛設(shè)置的默認(rèn)值已經(jīng)更新為“百度經(jīng)驗”了
圖形界面操作修改
圖形界面操作設(shè)置就非常簡單了,直接編輯表的結(jié)構(gòu)點擊需要修改的列即可。
打開找到默認(rèn)值一般都有無,和自定義等選項
傳統(tǒng)情況
我們先回顧一下,在沒有 "立刻加列" 功能時,加列操作是怎么完成的。我們也借此來熟悉一下本期的圖例:
當(dāng)進行 加列操作 時,所有的數(shù)據(jù)行 都必須要 增加一段數(shù)據(jù)(圖中的 列 4 數(shù)據(jù))
如上一期圖解所講,當(dāng)改變數(shù)據(jù)行的長度,就需要 重建表空間(圖中灰藍的部分為發(fā)生變更的部分)
數(shù)據(jù)字典中的列定義也會被更新
以上操作的問題在于 每次加列 操作都需要重建表空間,這就需要大量 IO以及大量的時間
立刻加列
"立刻加列" 的過程如下圖:
請點擊輸入圖片描述
請點擊輸入圖片描述
"立刻加列" 時,只會變更數(shù)據(jù)字典中的內(nèi)容,包括:
在列定義中增加 新列的定義
增加 新列的默認(rèn)值
"立刻加列"?后,當(dāng)要讀取表中的數(shù)據(jù)時:
由于 "立刻加列" 沒有 變更行數(shù)據(jù),讀取的行數(shù)據(jù)只有 3 列
MySQL 會將 新增的第 4 列的默認(rèn)值,追加到 讀取的數(shù)據(jù)后
以上過程描述了 如何讀取?在 "立刻加列" 之前寫入的數(shù)據(jù),其實質(zhì)是:在讀取數(shù)據(jù)的過程中,"偽造"?了一個新列出來
那么如何讀取?在 "立刻加列" 之后?寫入的數(shù)據(jù)呢 ? 過程如下圖:
當(dāng)讀取 行 4 時:
請點擊輸入圖片描述
請點擊輸入圖片描述
通過判斷?數(shù)據(jù)行的頭信息中的instant?標(biāo)志位,可以知道該行的格式是 "新格式":該行頭信息后有一個新字段?"列數(shù)"
通過讀取?數(shù)據(jù)行的?"列數(shù)"?字段,可以知道 該行數(shù)據(jù)中多少列有 "真實" 的數(shù)據(jù),從而按列數(shù)讀取數(shù)據(jù)
通過上圖可以看到:讀取?在"立刻加列"?前/后寫入的數(shù)據(jù)是不同的流程
通過以上的討論,我們可以總結(jié)?"立刻加列"?之所以高效的原因是:
在執(zhí)行?"立刻加列"?時,不變更數(shù)據(jù)行的結(jié)構(gòu)
讀取 "舊" 數(shù)據(jù)時,"偽造"?新增的列,使結(jié)果正確
寫入 "新" 數(shù)據(jù)時,使用了新的數(shù)據(jù)格式(增加了instant標(biāo)志位 和?"列數(shù)"?字段),以區(qū)分新舊數(shù)據(jù)
讀取 "新" 數(shù)據(jù)時,可以如實讀取數(shù)據(jù)
那么?我們是否能一直 "偽造"?下去???"偽造"?何時會被拆穿 ?
考慮以下場景:
用 "立刻加列" 增加列 A
寫入數(shù)據(jù)行 1
用 "立刻加列" 增加列?B
寫入數(shù)據(jù)行?2
刪除列?B
我們推測一下 "刪除列 B" 的最小代價:需要修改 數(shù)據(jù)行中的instant標(biāo)志位或?"列數(shù)"?字段,這至少會影響到?"立刻加列"?之后寫入的數(shù)據(jù)行,成本類似于重建數(shù)據(jù)
從以上推測可知:當(dāng)出現(xiàn) 與?"立刻加列"?操作不兼容 的 DDL 操作時,數(shù)據(jù)表需要進行重建,如下圖所示:
請點擊輸入圖片描述
請點擊輸入圖片描述
擴展思考題:是否能設(shè)計其他的數(shù)據(jù)格式,取代instant標(biāo)志位和?"列數(shù)"?字段,使得 加列/刪列 操作都能 "立刻完成" ?(提示:考慮 加列?- 刪列?- 再加列 的情況)
使用限制
在了解原理之后,我們來看看?"立刻加列"?的使用限制,就很容易能理解其中的前兩項:
"立刻加列"?的加列位置只能在表的最后,而不能加在其他列之間
在元數(shù)據(jù)中,只記錄了 數(shù)據(jù)行 應(yīng)有多少列,而沒有記錄 這些列 應(yīng)出現(xiàn)的位置。所以無法實現(xiàn)指定列的位置
"立刻加列"?不能添加主鍵列
加列 不能涉及聚簇索引的變更,否則就變成了 "重建" 操作,不是 "立刻" 完成了
"立刻加列"不支持壓縮的表格式
按照 WL 的說法:"COMPRESSED is no need to supported"(沒必要支持不怎么用的格式)
總結(jié)回顧
我們總結(jié)一下上面的討論:
"立刻加列" 之所以高效的原因是:
在執(zhí)行 "立刻加列" 時,不變更數(shù)據(jù)行的結(jié)構(gòu)
讀取 "舊" 數(shù)據(jù)時,"偽造"?新增的列,使結(jié)果正確
寫入 "新" 數(shù)據(jù)時,使用了新的數(shù)據(jù)格式?(增加了?instant 標(biāo)志位?和 "列數(shù)" 字段),以區(qū)分新舊數(shù)據(jù)
讀取 "新" 數(shù)據(jù)時,可以如實讀取數(shù)據(jù)
"立刻加列"?的 "偽造" 手法,不能一直維持下去。當(dāng)發(fā)生?與 "立刻加列" 操作不兼容?的 DDL?時,表數(shù)據(jù)就會發(fā)生重建
回到之前遺留的兩個問題:
"立刻加列" 是如何工作的 ?
我們已經(jīng)解答了這個問題
所謂 "立刻加列" 是否完全不影響業(yè)務(wù),是否是真正的 "立刻" 完成 ?
可以看到:就算是 "立刻加列",也需要變更 數(shù)據(jù)字典,那么 該上的鎖還是逃不掉的。也就是說 這里的 "立刻" 指的是 "不變更數(shù)據(jù)行的結(jié)構(gòu)",而并非指 "零成本地完成任務(wù)"
1 如果只是想查詢出是那一列,可創(chuàng)建一個自定義函數(shù)來實現(xiàn):
delimiter |
drop function if exists fun_tab_test |
create function fun_tab_test (par_id int, par_comparevalue int)
returns varchar(20)
begin
declare rvalue varchar(20);
select ( case when count(*) = 0 then '' when b = par_comparevalue then 'b' when c = par_comparevalue then 'c' else '' end ) as colA
into rvalue from tab_naem where id = par_id;
return rvalue ;
end |
delimiter ;
使用:
select fun_tab_test(1, 400); --參數(shù)分別為傳入的id和對比的值400
結(jié)果為含400值的列或''(沒有找見包含的列)時,接下來做你想做的update或delete等即可;
2 如果要完成一個自動的update,可使用before update觸發(fā)器,提供個簡單示例,進行適應(yīng)性修改:(這里n為表名,a為id列,b,c 為兩個可能包含400值的列)
delimiter |
drop trigger if exists tr_n_before_update; |
create trigger tr_n_before_update before update on n
for each row begin
declare svalue int;
select b into svalue from n where n.a = new.a;
if svalue = 400 then
set new.b = 0;
end if;
select c into svalue from n where n.a = new.a;
if svalue = 400 then
set new.c = 0;
end if;
end; |
delimiter ;
MYSQL_ROW row; 是mysql內(nèi)部的類型,可能是一個結(jié)構(gòu)體A,mysql先執(zhí)行以下desc table的操作,依照表結(jié)構(gòu)創(chuàng)建字段,也可能只是得到一行數(shù)據(jù)有幾列,分別是什么類型。
row = mysql_fetch_row(result)會取一樣的數(shù)據(jù),mysql里面每成功調(diào)用一次這個函數(shù)mysql_fetch_row就會取一行,類似
vectorstruct A v_a;
··········賦值v_a·········
全局定義 int x = 0;
function: mysql_fetch_row
while (x v_a.size())
row = v_a[x++];
mysql_fetch_lengths是得到一個row里面有多少數(shù)據(jù),也就是table里的字段數(shù)
后面取的過程就很簡單了,某個字段row[i] 為空的時候,不做row[i] ? row[i] : "NULL" 取到的會是個'\0',這個對于程序處理是比較危險的,為空的時候就附值一個標(biāo)識是比較常用的做法。
fyi
1、建表時指定,如 create table test ( id int default 0; ) 2、已經(jīng)建表的需要修改列屬性,如 create table test ( id int ; ) 修改如下: alter table test change id id int default 0;
標(biāo)題名稱:mysql怎么錄取列值,MySQL約束某列值為0或1
文章地址:http://redsoil1982.com.cn/article18/hspcdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、App設(shè)計、網(wǎng)站建設(shè)、建站公司、關(guān)鍵詞優(yōu)化、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)