DAY02
一、修改表結構
修改表結構會影響表中已有記錄,表結構的修改受表中已有記錄的限制。因此要在插入表記錄之前修改表結構,若已有記錄,在修改前先備份。
默認只有數據庫管理員root從數據庫服務器本機登錄時,纔有修改表結構的權限
1、alter table 數據庫名.表名 處理動作; //修改表結構
處理動作:
1.1添加新字段: add
格式:alter table 數據庫名.表名 add 字段名…
例:
mysql> alter table 數據庫名.表名
mysql> add 字段名 字段類型(寬度) 約束條件 after 字段名,
mysql> add 字段名 字段類型(寬度) 約束條件 first,
mysql> add 字段名 字段類型(寬度) 約束條件;
first //把新添加的字段添加在所有字段的上方
after字段名 //把新字段添加在指定字段名的下方
默認新添加的字段追加在已有字段末尾,first把新添加的字段添加在所有字段的上方,’after字段名’ 把新字段添加在指定字段名的下方
1.2刪除字段: drop
格式:alter table 數據庫名.表名 drop 字段名;
例:
mysql> alter table 數據庫名.表名
mysql>drop字段名,
mysql>drop字段名;
1.3修改字段類型: modify
格式:alter table 數據庫名.表名 modify 字段名;
例:
mysql> alter table 數據庫名.表名
mysql> modify 字段名 新字段類型(寬度) 約束條件,
mysql>modify 字段名 新字段類型(寬度) 約束條件,
mysql>modify 字段名 新字段類型(寬度) 約束條件;
1.4修改字段名: change (既能該名字,又能該類型)
格式:alter table 數據庫名.表名 change 原字段名 新字段名
例:
mysql> alter table 數據庫名.表名
mysql>change原字段名 新字段名字段類型(寬度) 約束條件,
mysql> change 原字段名 新字段名 字段類型(寬度) 約束條件,
mysql> change 原字段名 新字段名 字段類型(寬度) 約束條件;
change 即能改字段名 也能改約束條件 ,如果只改字段名,後面字段類型,約束條件原樣落下。
2、alter table 原表名 rename to 新表名; //修改表名
3、create table 新表名 SQL查詢語句; //複製表
例:create table newuserselect * from mysql.user;
4、create table 新表名 沒有查詢結果的SQL語句; //複製原表的表結構
SQL查詢語句結果爲空時,複製表結構
例:create table newuser1select * from mysql.user where host=’12’;
drop table 表名; //刪除表
update 表名 set 字段名= where 條件 //更新表記錄
例:update yg_tab set yg_id=8 where yg_id=2;
mysql>update mysql.user set host='192.168.1.1' wherehost='192.168.1.10';
二、mysql索引類型
1、什麼是索引
相當於書的目錄,表結構中的Key字段
不同的索引有不同作用,功能,使用規則也不同。
2、索引的優缺點
優點:加快查詢表記錄速度
缺點:減慢對錶記錄的寫速度(insertupdate delete)、佔物理磁盤空間。
默認情況下用.MYI文件存儲表索引信息 .MYD存儲表記錄 .frm存儲表結構
3、怎麼查看錶裏是否有索引字段
查看錶結構,desc 表名,再看 key字段是否有值,不同的值代表不同索引類型。
4、怎麼看錶裏的索引信息
show index from 數據庫名.表名 //查看錶的索引字段詳細信息
# Show create table t9 //查看t9表的建表過程
索引名key_name
索引字段名Column_name
索 引 算法Index_type (BTREE 、B+TREE、hash)
默認使用的算法是BTREE算法
BTREE算法:二叉樹算法
5、mysql支持哪些索引 ,使用說明
不同的索引類型有不同的功能和約束方式
使用索引時要滿足索引的使用規則
什麼是索引
索引相當於一本書的目錄
優點:加快查詢速度
缺點 佔用空間,減慢更新速度
●普通索引index :一個表中可以把多個字段設置爲index字段,
index字段值可以重複,把經常做查詢條件的字段設置爲index字段,index字段的KEY標誌是MUL。
創建index字段
1. 把已有表中的某個字段設置爲index字段
Create index name on stu (name);
索引名稱(通常和字段重名) 表名(字段名);
Show index from 表名: \G 換行顯示
查看一個表的索引詳細信息,默認使用BTREE算法
Drop index 索引名 on 表名
BTREE算法又稱二叉樹算法
Update 表名 set 字段名=值;
Update tea3 settea_id=1;
更新表中對應字段名稱爲值
2. 建表時指定索引字段
Create table 表名(字段名 字段類型(寬度) 條件,index(索引字段,索引字段)
默認第一個作爲索引名。
mysql> create table tea3(
-> name char(3) notnull,
-> age int(3),
-> index(name),
-> index(age));
二叉樹深度= 分開後的高度
●主 鍵primary key:一個表中只可以有一個主鍵字段且主鍵字段的值不可以重複。標誌爲PRI
當把一個表中的多個字段設置爲primary key字段時,叫複合主鍵,複合主鍵要在建表之初一起創建。 向表中的複合主鍵"字段"插值時,只要複合主鍵"字段的值"不同時重複就可以。
primarykey 通常與auto_increment(自動增長) 連用,作用是讓字段值自動增長。每添加一條記錄,字段值自動加 +1, 是從當前記錄最大值開始
通常把表中查詢時能夠唯一定位一條記錄的字段設置爲primary key 字段。
加auto_increment屬性字段類型要是整型數值類型 只有primary key 纔可以使用auto_increment屬性。
如果不是主鍵不能設置auto_increment。(auto_increment 自動增長,字段類型是整數型)
通常把編號字段作爲主鍵,自動增長的初始值是零
讓字段的值自動增長要滿足如下條件”
1. 字段類型必須是整形數值類型
2. 必須是主鍵字段 (僅主鍵可設置自動增長,主鍵可不設置自動增長
3. Createtable tea5(
Id int(3)primary key,
Namechar(3),
Age int(3)
);
複合主鍵 複合主鍵要在建表之初一起創建
●外 鍵foreign key:外鍵就是表與表之間做關聯,讓當前表裏字段的值受另一表裏字段值限制
外鍵的使用規則?建外鍵條件:(1)表的存儲引擎要是innodb存儲引擎
(2)外鍵字段的類型要一致
(3)被參考字段要有明確的索引(index,primary key)7,
也就是必須要建索引。
具有外鍵屬性的字段不能直接刪除,表可以刪除。子表中一個字段可以參考不同父表中的字段(插入
的數據必須在兩個父表中都存在)。子表中的不同字段也可以參考不同父表中的字段(插入的數據必
須在兩個父表中分別存在)。若要刪除父表,需先刪除子表的外鍵約束。
建表:
Createtable tab_name(字段)engine=innodfb; // 建表設置存儲引擎
創建外鍵: 在下方
全文索引 fulltext:
唯一索引unique:
使用規則:
一個表中可以有多個unique字段,unique字段值不可以重複,unique字段key標誌是UNI,unique字段值允許爲NULL,當修改爲不允許爲NULL時,則字段限制與主鍵相同。
設置唯一索引
create uniqueindex 索引名 on 表名(索引字段)
create unique index tea_id on tea3(tea_id)
建表時建立
Create table tea4(
Tea_id int(3)not null,
Name char(3)not null,
Age int(3) not null,
Sex enum(“m“,”w”),
Index (name),
Unique(tea_id));
6、如何在表裏設置索引字段
(1)建表時創建索引字段
1)設置index字段、unique字段
create table stu(
stu_id varchar(10),
name varchar(10) not null ,
age tinyint(3)unsigned,
sex enum(“boy”,”girl”),
index (name,sex), //默認把第一個作爲索引名,這是需要用show index from 數據庫名.表名 顯示詳細索引信息。
unique(stu_id)
);
2)設置主鍵
create table t1( id int(2) primary key, name varchar(9), age int(2) ); |
或
創建複合主鍵 (只能在建表之初創建)
create table t2 (
ip varchar(15),
port varchar(5),
sername varchar(10),
status enum(‘deny’,’allow’) default ‘deny’,
primary key(ip,port)
);
mysql> create table ser (
-> c_ip char(15),
-> ser_nvarchar(15),
-> portchar(5),
-> statusenum("allow","deny") default "deny",
-> primarykey(c_ip,port)
-> );
3)創建外鍵
Createtable tab_name(字段)engine=innodfb; // 建表設置存儲引擎
foreign key (當前表裏字段名) references 表名(表名裏的字段名)
on updatecascade //同步更新 on delete cascade //同步刪除 這兩個之間用空格隔開。
Create tablegz_tab(
Gz_id int(3) not null ,
Show create table 表名
刪除外鍵
Alter table 表名drop foreign key 外鍵名
delete from 表名; // 刪除表中所有記錄
where 字段名=值;
在已有表中添加索引字段
1)添加index字段
create index 索引名 on 表名(字段名列表); //通常索引名與字段名同名
例:create index name on stu(name);
create index sexon stu(sex);
2)添加unique字段 //若表記錄中unique字段值不唯一,則不成功
createunique index 索引名 on 表名(字段名列表);
例:create unique index stu_id on stu(stu_id);
3)添加主鍵 //若表記錄中主鍵字段值有NULL,則不成功
alter table 表名 add primary key(字段名);
例:delete from t1 where id is null; //刪除t1表中id值爲空的記錄
alter table t1 addprimary key(id);
alter table t1 modify id int(2) not null auto_increment;//主鍵通常與auto_increment 連用
4)添加外鍵
alter table 子表名 add foreign key(字段名) references 父表名(字段名);//當子表字段下有值並不在父表中時,添加不成功
7、如何刪除表中字段的索引屬性
1)刪除index索引、unique索引
drop index 索引名 on 表名;
例:drop index name on stu;
drop index stu_id on stu;
2)刪除主鍵 若有auto_increment,需先刪除自動增長
alter table t1 modify id int(2) notnull; 修改id字段的約束條件
alter table t1 drop primary key; //刪除主鍵
alter table t1 drop foreign key 外鍵名; //通過show create table表名查看外鍵名
例:altertable t1 drop foreign key t_ibfk_1;
三、mysql存儲引擎
1) MyISAM特點:支持表級鎖定,不支持行級鎖定,不支持事務,獨享表空間,多用在查詢、插入較多的表。
相關的表: XXX.frm 存放的表結構 XXX.MYI 索引信息 XXX.MYD表中的數據 記錄
2)innodb支持事務和事務回滾, 支持表級/行級鎖定 共享表表空間
事務= 一次sql操作從開始到結束的過程
xxx.frm 存儲表結構
xxx.ibd 存儲數據
索引和記錄用同一個文件存儲/var/lib/mysql/ibdata1,ibdata1在服務初始化時生成,10M,用完後,服務器自動增大)
事務:一次SQL操作從開始執行到正確執行結束的過程
事務回滾:ib_logfile0 ib_logfile1
set autocommit=0; // 關閉自動提交功能
start transaction; //開啓事務
create table 30(id int) engine=innodb;
insert into t30 values(200);
select * from t30;
在另一終端查看(事務未提交,查看不到)
rollback; //回滾
insert into t30 values(100);
commit;//提交,事務結束,永久生效
3)myisam支持表鎖,innodb支持行鎖
鎖機制:解決用戶的併發訪問衝突問題
鎖粒度:表鎖-併發訪問量低 系統開銷小
行鎖-併發訪問量高 系統開銷大
頁級鎖:對整個頁面(MySQL管理數據的基本存儲單位)進行加鎖
鎖類型:寫鎖(delete update insert)互斥鎖、排它鎖特點:獨佔鎖,上鎖期間其他線程不能讀表或寫表
讀鎖(select desc show)共享鎖特點:支持併發讀,寫操作被鎖
幻讀(兩次讀出的數據不同)與髒讀(從內存讀出的數據)
死鎖:鎖超時
寫鎖優先級高於讀鎖*
獲取寫鎖時,其他操作均需等待寫鎖釋放後執行。
查看當前的鎖狀態
查看table_lock開頭的變量,% 作通配符
show status like ‘ table_lock% ’;