Mysql數(shù)據(jù)庫創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法
本文實(shí)例講述了mysql創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過存儲(chǔ)過程新增字段相關(guān)操作技巧,需要的朋友可以參考下。...
本文實(shí)例講述了MySQL創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過存儲(chǔ)過程新增字段相關(guān)操作技巧,需要的朋友可以參考下。
需求:
往某數(shù)據(jù)庫的某個(gè)表中新增一個(gè)字段(若該字段已存在,則不做操作;若該字段不存在,則新增)
百度了n久,沒有符合要求的例子,只有參考加自己琢磨,最終終于給弄出來了,以下是幾個(gè)版本的更迭
第一版:
DELIMITER $
CREATE
PROCEDURE
insert_column()
BEGIN
IF
NOT
EXISTS(
SELECT
1
FROM
information_schema.columns
WHERE
table_schema=
'ltivalley'
AND
table_name=
't_luck'
AND
column_name=
'sss'
)
THEN
alter
table
ltivalley.t_luck
add
sss
varchar
(255)
not
Null
;
end
if;
END
$
DELIMITER ;
此存儲(chǔ)過程可以做到往ltivalley數(shù)據(jù)庫的t_luck表中新增一個(gè)sss的字段,但寫死了,毫無靈活性,故沒用!
第二版:
DELIMITER $
CREATE
PROCEDURE
insert_column(
in
dbname
varchar
(255),
in
tbname
varchar
(255),
in
colname
varchar
(255))
set
@sql_1= concat(
"IF NOT EXISTS(SELECT 1 FROM
information_schema.columns WHERE table_schema="
,dbname,
"
AND table_name="
,tbname,
" AND column_name="
,colname,
")
THEN
alter table "
,dbname,
"."
,tbname,
" add "
,colname,
"
varchar(255) not null;
end if;"
);
PREPARE
stmt
FROM
@sql_1;
EXECUTE
stmt;
DEALLOCATE
PREPARE
stmt;
END
$
DELIMITER ;
創(chuàng)建存儲(chǔ)過程沒有問題,但當(dāng)調(diào)用的時(shí)候就會(huì)出錯(cuò),報(bào) "IF"左右出錯(cuò),原因是在mysql中IF只能存在于存儲(chǔ)過程中,此處用EXECUTE stmt來執(zhí)行,等于是不在存儲(chǔ)過程里面執(zhí)行if語句,所以報(bào)錯(cuò),執(zhí)行不了!故沒用!
第三版
DELIMITER $
CREATE
PROCEDURE
insert_column(
in
dbname
varchar
(255),
in
tbname
varchar
(255),
in
colname
varchar
(255))
BEGIN
SET
@selec=CONCAT(
'SELECT 1 FROM information_schema.columns WHERE table_schema="'
,dbname,
'" AND table_name="'
,tbname,
'" AND column_name="'
,colname,
'"'
);
PREPARE
selec
FROM
@selec;
SET
@addcol=CONCAT(
'ALTER TABLE '
,dbname,
'.'
,tbname,
' ADD '
,colname,
' VARCHAR(255)'
);
PREPARE
addcol
FROM
@addcol;
IF
NOT
EXISTS(
EXECUTE
selec;)
THEN
EXECUTE
addcol;
END
IF;
END
$
DELIMITER ;
無法創(chuàng)建存儲(chǔ)過程,原因是在IF NOT EXISTS()中,不能執(zhí)行EXECUTE selec語句,原因未知。故沒用!
終極版
DROP
PROCEDURE
IF EXISTS insert_column;
DELIMITER $
CREATE
PROCEDURE
insert_column(
in
dbname
varchar
(255),
in
tbname
varchar
(255),
in
colname
varchar
(255))
BEGIN
set
@iscolexists = 0;
SET
@selec=CONCAT(
'SELECT count(*) into @iscolexists FROM information_schema.columns WHERE table_schema="'
,dbname,
'" AND table_name="'
,tbname,
'" AND column_name="'
,colname,
'"'
);
PREPARE
selec
FROM
@selec;
EXECUTE
selec;
DEALLOCATE
PREPARE
selec;
SET
@addcol=CONCAT(
'ALTER TABLE '
,dbname,
'.'
,tbname,
' ADD '
,colname,
' VARCHAR(255)'
);
PREPARE
addcol
FROM
@addcol;
IF(@iscolexists=0)
THEN
EXECUTE
addcol;
END
IF;
END
$
DELIMITER ;
最終的結(jié)果,先執(zhí)行EXECUTE selec,將結(jié)果存放到一個(gè)變量@iscolexists中,然后再在IF()中判斷@iscolexists的值,做相應(yīng)操作。可用!
以上就是Mysql數(shù)據(jù)庫創(chuàng)建存儲(chǔ)過程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法的全部?jī)?nèi)容了,希望本文所述對(duì)大家MySQL數(shù)據(jù)庫計(jì)有所幫助。
- Mysql數(shù)據(jù)庫自定義函數(shù)的定義、使用方法及操作注意事
- Mysql數(shù)據(jù)庫的max_allowed_packet設(shè)定方法
- Mysql數(shù)據(jù)庫亂碼出現(xiàn)的各個(gè)階段以及對(duì)應(yīng)方法
- MySQL數(shù)據(jù)庫的事務(wù)處理用法與實(shí)例代碼詳解
- Mysql數(shù)據(jù)庫使用from與join兩表查詢的方法區(qū)別總結(jié)
- Sql Server數(shù)據(jù)庫類似正則表達(dá)式的字符處理問題
- SQL Server數(shù)據(jù)庫中表和索引結(jié)構(gòu)存儲(chǔ)的原理及如何加快
- SQL Server Page數(shù)據(jù)庫結(jié)構(gòu)深入分析
- 基于Sql server數(shù)據(jù)庫的四種分頁方式總結(jié)
- SQL Server 2016數(shù)據(jù)庫快照代理過程詳解
Mysql數(shù)據(jù)庫自定義函數(shù)的定義、使用方法及操作注意事項(xiàng)
文章主要介紹了MySQL自定義函數(shù)簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了mysql自定義函數(shù)的基本定義、使用方法及操作注意事項(xiàng),需要的朋友可以參考下。...
Mysql數(shù)據(jù)庫的max_allowed_packet設(shè)定方法
小編為大家分享一篇關(guān)于Mysql的max_allowed_packet設(shè)定,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧...
Mysql數(shù)據(jù)庫亂碼出現(xiàn)的各個(gè)階段以及對(duì)應(yīng)方法
MySQL中數(shù)據(jù)庫亂碼一般進(jìn)行字符集的設(shè)定即可,但是亂碼可以出現(xiàn)在各個(gè)階段,所以這篇文章整理一下亂碼出現(xiàn)的各個(gè)階段以及對(duì)應(yīng)方法。...
MySQL數(shù)據(jù)庫的事務(wù)處理用法與實(shí)例代碼詳解
文章主要介紹了mysql事務(wù)處理用法與實(shí)例代碼詳解,詳細(xì)的介紹了事物的特性和用法并實(shí)現(xiàn)php和mysql事務(wù)處理例子,非常具有實(shí)用價(jià)值,需要的朋友可以參考下...
Mysql數(shù)據(jù)庫使用from與join兩表查詢的方法區(qū)別總結(jié)
文章主要給大家介紹了關(guān)于mysql使用from與join兩表查詢的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面...
Sql Server數(shù)據(jù)庫類似正則表達(dá)式的字符處理問題
SQL Serve提供了簡(jiǎn)單的字符模糊匹配功能,比如:like, patindex,不過對(duì)于某些字符處理場(chǎng)景還顯得并不足夠,日常碰到的幾個(gè)問題有:...
SQL Server數(shù)據(jù)庫中表和索引結(jié)構(gòu)存儲(chǔ)的原理及如何加快搜索速度分析
本文詳細(xì)分析了SQL Server中表和索引結(jié)構(gòu)存儲(chǔ)的原理以及對(duì)于如何加快搜索速度和提高效率等方面做了詳細(xì)的分析,以下是主要內(nèi)容。...
SQL Server Page數(shù)據(jù)庫結(jié)構(gòu)深入分析
SQL Server存儲(chǔ)數(shù)據(jù)的基本單元是Page,每一個(gè)Page的大小是8KB,數(shù)據(jù)文件是由Page構(gòu)成的。在同一個(gè)數(shù)據(jù)庫上,每一個(gè)Page都有一個(gè)唯一的資源標(biāo)識(shí),標(biāo)識(shí)符由三部分組成...
基于Sql server數(shù)據(jù)庫的四種分頁方式總結(jié)
下面小編就為大家分享一篇基于sqlserver的四種分頁方式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧。...
SQL Server 2016數(shù)據(jù)庫快照代理過程詳解
本文我們通過SQL Server 2016一個(gè)實(shí)例數(shù)據(jù)表,給大家詳細(xì)分析了快照代理過程遇到的問題和解決辦法,并對(duì)快照生成過程做了詳細(xì)說明,以下是全部?jī)?nèi)容:...