删除username的索引
-- 刪除index_name 索引
drop index index_name on user;
show index from user \G;
-- 創建新索引列組成,index_pinyin為復合索引名稱
create index index_pinyin on user(username,pinyin);
-- 這里省略主鍵索引
show index from user \G;
像這樣由兩個以上組成的索引稱為復合索引,由于是復合索引因此索引的名稱相同,注意Seq_in_index代表索引字段的順序,
前面我們說過在查詢條件中使用了復合索引的第一個字段(這里指username),索引才會被使用。因此,在復合索引中索引列
的順序至關重要。
唯一索引
創建唯一索引必須制定關鍵字UNIQUE,唯一索引和單列索引類似,只要的區別在于,唯一索引限制列的值必須唯一,但允許有空值。
對于多個字段,唯一索引規定列值的組合必須唯一。如創建username為唯一索引,那么username的值是不可以重復的
-- 創建唯一索引
create unique index index_name on tbl_name(index_col_name[,.....]);
-- 添加 (通過修改表結構)
alter table tbl_name add unique index index_name on (index_col_name[,.....]);
-- 創建表時直接指定
create table `table` (
`id` int(11) not null auto_increment,
name varchar(32) not null,
...... -- 其他字段
primary key (‘id’),
unique indexName (name(32))
);
下面為user表的username字段創建唯一索引:
-- 僅為演示
create unique index idx_name on user(username);
事實上這里講username 設置為唯一索引是不合理的,畢竟用戶可能存在相同username,因此在實際生產環節中username是不應該
設置為唯一索引的。否則當有相同的名稱插入時,數據庫表將會報錯。
主鍵索引
主鍵索引也稱叢生索引,是一種特殊的唯一索引,不允許有空值。創建主鍵索引語法如下:
alter table tbl_name add primary key (index_col_name);
一般情況下在創建表時,指明了主鍵時,主鍵索引就已自動創建了,因此無需我們手動創建。
-- 創建表時直接指定
create table `table`(
`id` int(11) not null auto_increment,
..... -- 其他字段
primary key(`id`), -- 主鍵索引
);
索引的設計
where子句中的列可能最適合作為索引
不要嘗試為性別或者有無這類字段等建立索引(因為類似性別的列,一般只含有 '0' 和 '1'),無論搜索結果如何都會大約得出一半
的數據)
如果創建符合索引,要遵循最左前綴法則。即查詢從索引的最左前列開始,并且不跳過索引中的列
不要過度使用索引。每一次的更新,刪除,插入都會維護該表的索引,更多的索引意味著占用更多的空間
使用InnoDB存儲引擎時,記錄(行)默認會按照一定的順序存儲,如果已定義主鍵,則按照主鍵順序存儲,
由于普通索引都會保存主鍵的鍵值,因此主鍵應盡可能的選擇較短的數據類型,以便節省存儲空間
不要嘗試在索引列上使用函數。
存儲過程
為什么需要存儲過程
迄今為止,我們所使用的大多數SQL語句都針對一個或多個表的單條語句,當需要通過處理流程來達到預期目標時,
單條sql語句就很難做到了,這是因為sql語句無法編寫處理流程的語句,所有的sql都只能通過一個個命令執行,比如想
循環執行某個sql語句,對于沒有處理流程的sql顯然是無法實現的,此時就需要通過存儲過程來達到目的了,簡單的理解存儲過程就是數據庫中
保存的一系列sql命令的集合,也就是說通過存儲過程就可以編寫流程語句,如循環操作語句等,下面看看如何使用存儲過程。
存儲過程的創建和使用
可以通過以下語法創建存儲過程:
create procedure 存儲過程名稱(參數種類 參數 數據類型)
begin
處理內容
end
存儲過程的名稱可以自由定義,但不可與存在的函數或存儲過程名稱重復,命令時建議以【sp_】開頭,需要處理的內容
則編輯在begin 和 end 之間。參數的種類分3種,分別是 in out inout 其中in為輸入參數類型,out為輸出參數類型,而
input既是輸入類型又是輸出類型,下面我們創建一個存儲過程,已達到對user表的用戶名稱進行模糊查詢的目的,存儲過程
名稱為 sp_search_user:
-- 改變分隔符
delimiter //
create procedure sp_search_user (in name varchar(20));
begin
if name is null or name =" " then
select * from user;
else?
select * from user where username like name;
end if;
end?
// -- 執行sql
delimiter; -- 恢復分隔符
其中delimiter 可以用于改變分隔符,由于存儲過程中流程語句需要使用分號結尾與 mysql 命令行的sql語句結尾的分號沖突m
于是改變分隔符為//, 執行完存儲過程后在恢復我i分號即可。從存儲過程創建語句中,我們設置一個name的輸出參數語句并在
begin與end之間編寫了流程語句,當名稱為空時查詢所有用戶否則按傳入的條件查詢。現在可以使用該存儲過程了,調用
語法如下:
call 存儲過程名稱(參數,.....)
call sp_search_user(null);
-- 查詢以為name以任開頭的用戶
call sp_search_user("任%");
輸入輸出參數類型
前面提到了三種輸入輸出的參數類型,IN輸入參數類型,out輸出參數類型,而input既是輸入類型又是輸出類型,所謂的IN
輸入參數類型就是把要傳遞的參數輸入到存儲過程的內部以便編寫存儲過程流程語句時可以使用。上述演示過的例子就是
這種類型。關鍵字out則是指明相應參數用來從存儲過程傳出的一個值,也可以理解為存儲過程的返回值,而對于input則是
兩者的結合體。現在我們創建一個存儲過程,用于返回商品的最大值、最小值和品均值,命名為sp_item_price
delimter //
-- 創建存儲過程
create procedure sp_item_price(out plow decimal(8,2),out phigh decimal(8,2),out pavg decimal(8,2))
begin
select min(price) into plow form items;
select max(price) into phight form items;
select avg(price) into pavg from items;
end;
//
-- 恢復分隔符
delimiter ;
-- 調用存儲過程
call sp_item_price(@privelog,@pricehight,@priceavg);
select @pricelow;
正如我們所看到的,創建sp_item_price時,使用了3個out參數,在存儲過程內部將會把執行結果分別存入這個三個變量中,
存入關鍵字使用的是into,完成存儲過程創建后,使用call sp_item_price (@pricelog,@pricehigh,@priceavg);調用sp_item_price,
傳入用于存儲返回值的3個變量,注意mysql的用戶量必須以@開頭,名稱可自定義,但不能重復,調用完成后語句并沒有這些變量。
這里有點要明白的, 上述存儲過程中使用對輸出變量的賦值語句:
select 列名1,... into 變量名1, .... from 表名 where 語句等...
請注意如果檢索出多個列名,與之對英國的賦值變量也必須有多個
delimiter //
-- 創建存儲過程
create procedure sp_order_sun_price(in numberf int , out ptotal decimal(8,2))
begin
select sum(price * items_sum) from items inner join orderdetail as od on items.id = od.items where od.orders_id = numbers
into ptotal; -- 放到語句后面也可行
end;
//
-- 恢復分隔符
delimiter;
-- 執行存儲過程
call sp_order_sum_price(3,@priceTotal);
-- 查詢結果
select @priceTotal;
刪除存儲過程
如果創建存儲過程有誤,可以刪除后重新創建,當然也可以修改,不過感覺不如刪除重建來的更簡單,刪除存儲過程可以使用
一下語句
drop procedure [if exists]? 存儲過程名稱;
查看存儲過程的狀態
show procedure status [like 'pattern']
如查看的sp_order_sun_price? 狀態
-- 查看的sp_order_sum_price 狀態
show procedure status like 'sp_order_sum_price' \G;
查看存儲過程的創建語句
查看已創建的存儲過程,可以使用以下語法
show create procedure 存儲過程名;
例
show create prrcedure sp_order_sum_price \G;
存儲過程的流程控制語句
以下是存儲過程中可以使用的流程控制語句
......
定義變量
使用declare 定義局部變量
在流程語句的分析中,我們在存儲過程中使用變量的聲明與設置,由于這些變量也只能在存儲過程中使用,因此也稱為局部變量,變量
的聲明可以使用以下語法:
declare 變量名[,變量名2...] 數據類型(type) [default value];
-- 定義變量num,數據類型為int型,默認值為10
declare num int default 10;
其中,declare 關鍵字是用來聲明變量的;變量名即變量的名稱,這里可以同時定義多個變量;type參數用來指定變量的類型;
default value 子句將變量默認值設置為value,沒有使用default 子句時,默認值為null,聲明后,我們就可以在存儲過程使用該
變量,設置變量值可以使用過以下語法;
set 變量名1 = expr [,變量名2 = expr] ...
其中,set關鍵字使用來我i變量賦值的;expr 參數是賦值表達式或某個值,一個set 語句可以同時為多個變量賦值,各個變量的
賦值語句之間用逗號隔開。除了這種賦值方式,前面我們還提到過使用select? into 語句為變量賦值,那也是可行的,。
了解其他類型的變量
用戶變量:"@" 開始, 形式為"@變量名" ,用戶變量跟mysql客戶端是綁定的,設置的變量,只對當前用戶使用的客戶端生效,
聲明或者定義用戶變量使用set語句,如 set @var 若沒有指定global 或session ,那么默認將會定義用戶變量。
全局變量:定義時,以如下兩種形式出現,set global 變量名,或者 set @@ global .name 對所有客戶端生效,只有具有
super 權限才可以設置全局變量,如下:
set blobal sort_buffer_size=value;
set @@global.sort_buffer_size=value;
會話變量:只對鏈接的客戶端有效。
set session sort_buffer_size=value;
?
轉載于:https://www.cnblogs.com/simadongyang/p/8456679.html
總結
以上是生活随笔為你收集整理的删除username的索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NGUI的button的创建的问题(Bu
- 下一篇: Grpc+Grpc Gateway实践一