mysql创建表示对属性进行说明_mysql基础
數據庫系統
DataBaseSystem=數據庫管理系統(DBMS,DataBaseManagementSystem)+數據庫(DataBase)+管理員
Mysql是關系型數據庫
關系型數據庫典型概念
數據庫:數據的倉庫
表table:數據是保存在表內的,保存在一個表內的數據,應具有相同的數據格式
行&列:行記錄數據,列規定數據格式(記錄:行內的數據 字段:數據的列)
SQL(Structured Query Language):數據庫管理系統,用來管理數據的語言(結構化查詢語言)
windows命令行啟動所有服務 services.msc
Net start 服務名
Net stop 服務名
啟動本地mysql d:phpmysqlbinmysql -hlocalhost -P3306 -uroot -p
分類
針對操作對象的不同,分成不同的語言:
數據操作(管理)語言DML
數據定義語言(對保存數據的格式、屬性定義)DDL
數據庫控制語言(對數據庫服務軟件操作)DCL
庫操作DDL
限定符(反引號):用于特殊字符、數字、關鍵字等標示符;
設置編碼:set names gbk;
創建數據庫 Create database db_name[數據庫選項];
顯示所有數據庫 show databases;
查看數據庫創建語句 show create batabase db_name;
數據庫刪除 drop database db_name;
修改數據庫 alter database db_name 指令;
表操作
創建表 create table 庫名.tbl_name(列結構)[表選項];
列定義:列名 數據類型[列的屬性(約束)],
字符串類型:varchar(最大長度)
date類型:date
指定當前默認數據庫 use db_name;
查看表 show tables[like 'pattern%'];(like 'pattern%'表示獲得pattern規則表名的表)
%通配符:表示任意字符的任意組合;(like 'XXX%',like '%xxx')
查看表創建信息 show create table tbl_name;
tip:用 G 結束換方式顯示
查看(描述)表結構(僅表) describe tbl_name;(或者desc tbl_name;)
刪除表 drop table [if exists]tbl_name;
修改表名(僅表):
rename table old_tbl_name to new_tbl_name;
rename table old_tbl_name to new_tbl_name,table1 to new_table,....;(可以同時修改多個表名)
跨數據庫重命名(把當前數據庫的表以重命名的方式移動到別的數據庫中)
rename table old_tbl_name to da_name.new_tbl_name;
tip 可以利用跨數據庫重命名把舊的數據庫中的表以重命名方式移動到新數據庫中,然后刪除舊的數據庫。
修改列定義
增加一個列 alter table tbl_name add 列定義(XXX varchar(10));
刪除一個列 alter table tbl_name drop 字段名;
修改一個列 alter table tbl_name modify 列定義;
修改列名 alter table tbl_name change old_name 列定義;
修改表選項 alter table tbl_name 新的表選項(character set utf8);
數據操作
創建數據(插入數據)
insert into 表名 (字段列表) values ('值列表');
如果要為所有字段設置值,可以省略字段列表,值的順序應與字段順序一致
獲得數據(查詢數據)
select 字段列表(*) from 表名 [查詢條件](where 1);
條件:where 字段名><=值;
刪除數據
delete from 表名 條件;(邏輯上嚴格給條件,語法上可以沒有條件,刪除所有用 where 1);
修改數據
update 表名 set 字段=新值,字段1=新值1......條件;
(邏輯上嚴格給條件,語法上可以沒有條件,修改所有用 where 1);
查看變量
show variables like 'character_set%';
校對規則
在當前編碼下字符之間的比較順序
區分大小寫ci
不區分大小寫cs
二進制比較(字節)_bin
show collation [like];
字符集_地區名_比較規則(ci,cs,bin)
在設置字符集的時候,可以設置當前所采用的校對規則,不設置,則默認。
create table tab3(name varchar(10))character set gak collate gbk_chinese_ci;
排序
order by 將數據按照某個字段排序
整型
tinyint 1個字節(-128--127)
定義是否有符號
使用unsigned(無符號)
定義顯示寬度
int(3) zerofill 3表示顯示的最小寬度
需要使用前導零填充 zerofill(一旦使用0填充則不能插入負數)
浮點型
單精度 float 4個字節 默認精度位數6位左右
雙精度 double 8個字節 默認精度位數16位左右
支持控制數值范圍
type(M,D)
M表示所有的數值位數(不包括小數點,和符號)
D表示允許的小數位數
支持科學計數法(1.23E2)
定點數
decimal(M,D)(有范圍)
M總位數(默認為10)
D小數位數(默認為0)
小數支持zerofill
小數支持unsigned
日期時間類型(支持0值)
年月日時分秒
datetime
'yyyy-mm-dd GG:ii:ss'(任意分隔符)
時間戳
timestamp
(有范圍)
檢索時 列+0 顯示時間戳
日期(同datetime)
date
time
表示具體時間
表示時間間隔
格式 D(天) HH:MM:SS
year
表示年份 如: 2017
字符串類型
M表示允許的字符串長度
char(M) 固定長度
varchar(M) 可變長度(范圍)
字段的最大長度,除了類型本身限制之外,記錄的總長度也有限制
真實的varchar長度
總長度65535
varchar特點,當類型數據超過255個字符時,用2個字節表示長度(65535-2=65533)
整條記錄,需要一個額外的字節,用于表示當前記錄的null值。
除非所有的字段都不是null(not null),這個字節才能省略(用65533創建成功)
一個記錄,不論有多少個字段存在null,都是用統一的一個字節來表示,而不是每一個字段一個字節。
TEXT(tinytext longtext...)
與當前版本varchar相似,總長度為4294967295(所有字符集)
區別:可以全部用來保存數據
定義時,通常不用指定長度,可以自己計算
(單選)ENUM枚舉類型(每個字段的值以整形存儲)
字段名 enum('1','a','C');
(多選)set集合類型(位運算存儲)(1,10,100,1000,.....)
字段名 set('a','b','c','d');
列屬性
是否為空 not null
默認值 default val(沒給定值時使用默認值,常見一個字段不能為空,使用默認值)
主鍵:PK(primary key):可以唯一標識,某條記錄的字段或者是字段的集合
主鍵可以是真實的實體的屬性,但常用一個與實體信息不想管的屬性作為唯一標識,與業務邏輯沒關系,只是用來做標記
設置主鍵:primary key(主鍵不能為空,不能沖突)
1.字段上設置 id int primary key,
2.最后設置(primary key(子段1,子段2...))(組合主鍵:一個主鍵包含多個子段)
(通常每個表都應存在一個唯一標識的主鍵)
唯一
unique(該字段的值不重復)
自動增長(可以不插入值,或者插入null/0)
為每條記錄提供一個唯一的標識
每次插入記錄時,將每個子段的值自動增加1
使用 auto_increment 標識
需要整型,還需要索引
自動增長的初始值可以設置,默認為1
通過表選項:auto_increment val;
如果val小于當前標識,則使用最大的val;
可以手動插入val值,如果是主鍵,不能重復
val值可以更新,是主鍵不能重復
表間關系
1對1
兩個實體表內,存在相同的主鍵字段
如果記錄的主鍵值等于另一個關系表內記錄的主鍵值,則兩條記錄對應
1對多
在多的那個表內增加一個字段用于指向該實體所屬另外實體的標識
多對多(兩個1對多)
利用一個中間表,表示實體之間的對應關系
中間表的每個記錄表示一個關系
外鍵FK(foreign key)
如果一個實體的某個字段,指向(引用)另個實體的主鍵,就稱這個實體的那個(指向另個實體的)字段為外鍵
被指向的實體稱之為(主表)主實體(父實體)(父表)
負責指向的實體,稱之為從實體(從表)(子實體)(字表)
作用
用于約束處于關系沒的實體
增加字表記錄時,是否有與之對相應的父表記錄
在刪除或者更新主表記錄時,從表應該如何處理相關的記錄
定義外鍵
在從表上建立一個外鍵指向主表的主鍵
foreign key(子表外鍵字段) references 父表名 (父表外鍵字段)
注釋comment 'val'
設置級聯操作:在主表數據發生改變時,與之對相應的從表應該如何處理
主表更新:on update
主表刪除: on delete
cascade 關聯操作,如果主表被更新或刪除,子表也會執行相應的操作
set null 表示從表不指向任何主表記錄
restrct 拒絕主表的相關操作
修改外鍵:先刪除,再新建
alter table tb_name drop foreign key 外鍵名;
刪除外鍵需要通過指定外鍵名稱達到目的,可以在創建時指定名稱,或者使用mysql默認生成的名稱
alter table tb_name add froeign 外鍵定義 級聯操作;
存儲引擎
在創建表,或者編輯表時,可以指定表的存儲引擎
engine 引擎類型
order by
order by 字段 升序|降序(asc|desc)
多字段排序
先按照第一個字段排序,如果不能區分
才使用的二個字段,一次類推
order by 字段 升序|降序(asc|desc),字段2 升序|降序(asc|desc)
limit
限制獲得的記錄數量
limit val;
limit offset,row_count;
offset 偏移量,默認從0開始
row_count 總記錄數
distinct
去除重復記錄(要查找的記錄完全重復的)
select distinct * from....
union
聯合查詢
將多條select語句的結果,合并在一起
使用union關鍵字
(第一條查詢語句)union(第二條查詢語句);
如果union 結果有重復的數據,默認值顯示一個,可以通過union all 顯示所有
子語句的括號不是必須的(為了便于讀程序加括號)
子語句的排序
將子語句包裹在括號內
子語句的order by 配合limit才生效
對所有語句排序
()union()order by
規定多個select語句檢索的字段必須一致
列順序必須一致(默認可以顯示成功)
子查詢
select * from tb_name where 字段名=(select max(字段名) from tb_name);
子查詢分類
返回值
單一值(標量子查詢)
一列(列子查詢)
多列(行子查詢)
表(表子查詢)
出現位置
where型
from型
exists型
使用
標量
子查詢獲得一個值后,使用關系運算符
= > < >= <= !=
列子查詢
子查詢獲得一列值后(同一類型數據的集合)
select * from tb_name where 字段名1 in|not in (select 字段名1 from tb_name where 條件);
等于集合中的任何一個=any(集合) =some(集合)
不等于集合中的所有元素!=all(集合)
行子查詢
子查詢返回一行(多個字段)
select * from tb_name where (字段1,字段2...)=(select 字段1,字段2 from tb_name where...limit 1);
表子查詢
子查詢返回一個表
select * from (子查詢語句)as 表別名 wehere...;
exixts子查詢
select * from tb_name1 where exists (select * from tb_name2 where tb_name1.字段名=字段名);
連接查詢join
將所有的數據,按照某種條件,連接起來,在進行處理
內連接
連接的多個數據都必須存在(默認inner 可以省略)
tbl_left inner join tbl_right on 連接條件(條件可以省略/cross join,稱為交叉連接/笛卡爾積)
select * from tb_1 inner join tb_2 on tb_1.id=tb_2.id;
on可以寫成where(外連接不能使用), using(字段名)(字段名稱一樣)
on連接時過濾
where連接后過濾
外連接(outer 可以省略)
如果負責連接的一個或多個數據不真實存在是外連接
tbl_left left outer join tbl_right on 連接條件
select * from tb_1 left outer join tb_2 on tb_1.id=tb_2.id;
左外連接 左邊表數據被保留 右邊如果沒有數據用null代替
右外連接
全外連接(mysql 暫不支持) 左外連接 uion 右外連接
as 別名(列別名,表別名)
select t.id as tid ,c.id as cid ,t.t_name as name from teac as t inner
join t_c as c on t.id=c.t_id;
自然連接
mysql自己判斷相同字段進行連接,不用指定連接條件
內自然連接 select * from tb_1 natural join tb_2;
左外 natural left join;
右外 natural right join;
將檢索到的數據保存在文件內
select * into outfile "文件地址" from...;
insert
插入部分字段可以:insert into tb_name set 字段名=val,字段名2=val...;
當主鍵沖突時默認插入不成功,可變成 update: on duplicate key
蠕蟲復制
使用select語句查詢到的數據作為插入的數據源
insert into tb_name (字段1,字段2...) select 字段1,字段2... from tb_name;
替換
replace into () values ();主鍵沖突則替換
數據導入
1. 導出 select *(主鍵null)into outfile 'path' from tb_name;
2. load data infile '文件路徑' into table tb_name;
delete
可使用where order by limit 限制刪除
多表刪除
delete from tb_1,tb_2 using tb_1 join tb_2 on tb_1.id=tb_2.id where...;
清空表(先刪除表,在新建表)
清空表內所有數據(包括自動增長)
truncate tb_name;
update
(where order by limit)
多表更新 update tb_1 join tb_2 on tb_1.id=tb_2.id set tb_1.字段=val,tb2.字段1=val... where ....;
備份還原
用mysqldump.exe
備份整個庫
備份:mysqldump -uroot -p 數據庫名 > 路徑/XXX.sql
還原(命令行):source 路徑/xxx.sql;
備份某個表
備份:mysqldump -uroot -p 數據庫名 表名1 表名2 表名3... > 路徑/XXX.sql
還原(命令行):source 路徑/xxx.sql;
視圖(虛擬表,控制真表那些字段被隱藏)
創建 create view 視圖名 as select 字段名 from tb_name;
刪除 drop view 視圖名
修改 alter view v_name [(新字段名)] as select 字段名 from tb_name;
作用: 隱藏復雜的業務邏輯
事務(innodb)(先將結果記錄在事務日志里,結束后向數據庫提交)
一組sql語句完成一個業務
如果有任何一條語句失敗,則都失敗,應該回到操作前的初始狀態
關閉自動提交功能 常用start transaction; 不常用set autocommit=1/0(開/關);
所有語句成功后提交 commit;
失敗 rollback;
事物的特點(acid)
原子性(整體不可分割)
一致性(事務結束前不會被其他的程序改變)
隔離性(兩個事務不會互相影響)
持久性(事務結束后數據修改永久生效)
觸發器
create trigger 名字 after update on 表名1 for each row update 表名2 set 字段=字段+??;
創建觸發器 creater trigger 名字 事件 執行代碼
事件:insert delete update
事件的時機:執行之前和之后 after before
由時機和事件在一起形成 6種事件
after insert before insert.......
可執行的代碼:
sql語句
1.觸發器不能同名
2.目前mysql只支持一類事件設置一個觸發器
管理觸發器
刪除:drop trigger trigger_name
查看:show create trigger trigger_name
在觸發器內,獲得觸發該觸發程序時的數據
利用觸發程序內的new和old來完成
old:舊的記錄(insert不能使用)
new:新的記錄(delete不能使用)
如果一個觸發器,由多條sql語句組成
1.語句組成語句塊(begin end)用來標識語句塊
2.語句塊的語句需要獨立的;結束符
命令行修改語句結束符 delimiter
PHP編碼對數據庫操作
連接和認證
mysql_connect(連接目標,用戶名,密碼);
連接目標:服務器地址+端口號
執行響應的sql語句
mysql_query();//發送一條sql語句
處理結果
決定于執行結果
a. 返回布爾值,直接根據布爾值給出提示
b. 返回結果集,在結果集內提取需要的數據fetch
`mysql_fetch_assoc(); mysql_fetch_row(); mysql_feach_array();`
assoc關聯數組,下標是字段名(字符串)
row索引數組,下標是字段位置(0,1,2)
array混合數組,下標2部分,字段名和索引位置
將連接釋放
mysql_close();
錯誤處理
mysql_error();錯誤信息
mysql_errno();錯誤編號
獲得執行結果額外的信息
獲得結果集內的數據數量
mysql_num_rows(結果集);
操作后受影響的行數
mysql_affected_rows();
獲得最新的自動增長的字段值
mysql_insert_id();
釋放資源
mysql_free_result(結果集);
sql編程
自定義變量
set @變量名=變量值
select 字段列表 into @變量列表
select @變量名:=val
格式化:format(val,val);
時間戳:unix_timestamp();from_unixtime(unix_timestamp());
5到10之間的隨機數:select floor(5+(rand()*5));
字節長度:length(val);
字符長度:char_length(val);
截取字符串:
substring('字符串','開始位置','長度');
lpad('字符串','位數','填充');
加密函數 md5(); password(); sha1();
自定義函數
create function 函數名 (參數列表) 返回值類型 函數體
create function say() returns varchar(10) begin .... end
流程控制
分支
if 條件1 then
1語句
else 條件2 then
2語句
.......
eles
語句
end if;
循環
while 條件 do
循環體
end while;
循環的提前終止
leave 標簽名 終止循環
iterate 標簽名 跳出本次循環
定義局部變量
declare i int default 0;
Example
create function fun2() returns int
begin
set @i=0;
set @sum=0;
tag:while @i<10 do
set @i=@i+1;
set @sum=@sum+@i;
end while tag;
return @sum;
end
$$
create function say(name varchar(10)) returns varchar(10)
begin
return concat('hello',name);
end
$$
存儲過程
delimiter $ --定界符(工具中不需要)
創建存儲過程
create procedure proc_name(in name varchar(10))
begin
select concat('hello ',name);
end
$
* 參數類型有 in out inout 默認為in
* in表示傳遞進參數值 過程內部處理對過程外部參數無影響 (只傳遞值)
* out 表示返回什么參數 過程內部處理對過程外部參數有影響 (只傳遞地址)
* inout 傳遞進參數值和地址 在內部處理后對外部該參數有影響 (傳遞值和地址)
刪除存儲過程
drop procedure proc_name
修改存儲過程
alter procedure proc_name
查詢procedure
show procedure status [where db='dbname']
或者
select name from mysql.proc [where db='dbname']
詳細查看
show create procedure dbname.proc_name
調用procedure
call proc_name(param)
預處理
準備:prepare 預處理名 from 'sql語句';
執行:execute 預處理名;
prepare pre_query from 'select * from shop where id=?';
set @id=6;
execute pre_query using @id;
查看mysql的用戶
select user,host,password from mysql.user;
select * from mysql.user;
創建用戶
grant 權限名稱 on *.* to '用戶名稱'@'登陸的主機' identified by '密碼';
. 表示所有庫和所有表
grant all on *.* to 'zpf'@'127.0.0.1' identified by'123';
grant all on *.* to 'zpf'@'%' identified by'123';(%表示所有)
刪除用戶
drop user '用戶名稱'@'主機名';
修改密碼(重啟服務后生效)
update mysql.user set password=password('密碼') where user='root';
root密碼丟失,找回
關閉mysql服務
進入到mysql的bin目錄,mysqld.exe --skip-grant-tables(無分號)
進入另一窗口進入mysql無需密碼
重新設置root密碼
update mysql.user set password=password('密碼') where user='root';
加載設置權限
flush privileges;
讀寫分離
bin-log日志
在配置文件中添加
bin-log=log 日志的文件名(該文件默認存儲在數據庫文件夾里)
指定存儲位置 bin-log='d://mysql/log'
查看日志mysql/bin/mysqlbinlog.exe
mysqlbinlog.exe --no-defaults log-bin日志的完整路徑
mysqlbinlog --no-defaults d://php/sqldata/binlog/binlog.000001
在查看該日志時,重點要記住記錄的sql語句和pos(存儲sql語句的位置)點。
在mysql中關于bin-log日志的命令
查看最新的bin-log日志
`show master status;`
* 生成最新的bin-log日志
`flush logs;`
* 清空log日志
`reset master;`
恢復數據
在修改數據之前先新建一個新的bin-log日志flush logs;
誤操作之后用最新日志之前舊的日志恢復
mysqlbinlog.exe --no-defaults 日志的完完整路徑 |mysql -uroot -padmin
使用bin-log的pos點恢復
先查看bin-log日志找到pos點
恢復(pos點用雙引號)
mysqlbinlog --no-defaults --start-position="開始pos點" --stop-position="結束pos點" d://php/slqdata/binlog/binlog.000001 | mysql -uroot -padmin
讀寫分離的配置
1、主服務器的配置:
(1)主服務器和從服務器都開啟bin-log日志,
(2)要給主從服務器設置一個唯一的server_id的值。并重啟服務器。
(3)給從服務器設置授權用戶
grant all on *.* to user1@192.168.10.10 identified by ‘456’;
或
grant replication slave on *.* to user@192.168.10.10 identified by ‘456’
或
grant replication slave on *.* to user@’%’identified by ‘456’
(4)查看主服務器的最后一個log-bin日志 的名字和pos點
show master status;
要注意:此時要停止對主服務器的任何操作。因為對主服務器有讀寫操作則postion會跟著改變。
2、從服務器的配置:
(1)先關閉從服務器(每次重新配置時需要先關閉)
stop slave
(2)開始配置:
change master to master_host=‘主服務器的ip地址’,master_user=‘主服務器上用于同步數據的賬號’,master_password=‘同步賬號的密碼’,master_log_file=‘bin日志的文件名’,master_log_pos=bin日志中的position值。
(3)開啟重服務器:
start slave
(4)查看有沒有成功:
show slave status \G
Slave_IO_Running:Yes
此進程負責從服務器從主服務器上讀取binlog 日志,并寫入從服務器上的中繼日志。
Slave_SQL_Running:Yes
此進程負責讀取并且執行中繼日志中的binlog日志,
注:以上兩個都為yes則表明成功,只要其中一個進程的狀態是no,則表示復制進程停止,錯誤原因可以從”last_error”字段的值中看到。
條件語句
where 必須是數據表中存在的字段
having 必須是結果集中存在的字段
都能使用
select id,name,age from user where id>5;
select id,name,age from user having id>5;
只能用where
select name,age from user where id>5;
只能用having
select id as sn,name,age from user having sn>5;
匹配查找
in(單個常量)
select * from tab_name where id in('1','2','3');
find_in_set(id,字符串列表) //逗號間隔的字符串('1,2,3,15,22')
select * from tab_name where find_in_set(id,'1,2,3');
索引
沒索引之前,一條條檢索(即使找到符合條件的記錄,也不會停止檢索,不能確定還有沒有符合條件的其他記錄,直到全部檢索數據)
有索引后,索引記錄到文件里,通過二叉樹算法(BTREE)檢索(每個二叉樹節點保存了磁盤的物理位置,因此拷貝數據庫文件后磁盤位置丟失,索引失效)
1.主鍵索引
2.唯一索引
3.全文索引
4.普通索引
1.添加
1.1主鍵索引
當一張表,把某個列設為主鍵,則該列就是主鍵索引
建表后添加主鍵索引 alter table tab_name add primary key(列名);
1.2普通索引
一般來說,普通索引是先創建表,然后創建普通索引
create index 索引名 on 表名(列名);
1.3全文索引(僅能用于myisam引擎)
全文索引主要針對文字(文本)檢索
fulltext(列名)
create table suoyin(
id int primary key auto_increment,
title varchar(100),
body text,
fulltext(title,body)
)engine myisam charset utf8;
建表后 create fulltext index 索引名 on 表名(字段)
用法:select * from tab_name where match(字段1,字段2) against('字符串');
查看匹配度(概率):select match(字段1,字段2) against('字符串') from tab_name;
注意:只對myisam引擎生效
針對英文生效(中文配合sphinx)
停止詞:因為在文本中,創建索引是無窮大的,對一些常用的字符,不會創建索引
1.4唯一索引
有unique約束,就會創建唯一索引(值可以為null,而且可以多個)
表創建后:create unique index 索引名 on 表名(列名)
2.查詢索引
desc 表名
show index from 表名
show keys from 表名
查詢索引是否啟用 explain select * from ....
3.刪除索引(有自增長的不能刪除,要先去掉(modify)自增長)
alter table tab_name drop index 索引名;
刪除主鍵索引
alter table tab_name drop primary key;
4.修改索引
先刪除,在創建索引
索引的副作用
磁盤占用
對dml語句的效率有影響(增刪改的同時還要對索引文件進行修改)
什么字段應該建索引?
較頻繁的作為查詢條件的字段
但是:唯一性太差的字段不適合創建索引(性別||值太少),更新非常頻繁的字段不適合鍵索引(在線狀態)
不會出現在where子句中的字段不該建索引
總結索引的使用場合
肯定在where條件里經常使用
該字段的內容有許多不同的值
字段值不頻繁變化
索引使用注意
多列(復合):對于創建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用
like匹配: 正確 like 'abc%' (錯誤'%abc'或'%abc%')(前面有%還要使用索引可以用全文索引)
explain結果說明
id:1 #查詢序列號
select_type:SIMPLE #查詢類型
table:tab_name #查詢表名
type:ALL #掃描方式 ALL表示全表掃描
possible_keys:NULL #可能使用到的索引
key:NULL #實際使用的索引
key_len:NULL
ref:NULL
rows:10 #掃描多少行,可能得到多少記錄數
Extra:Using where #額外信息
事務的隔離級別
read uncommitted 讀取未提交的數據(臟讀,幻讀,不可重復讀)
read committed 讀取已提交數據(幻讀,不可重復讀)
repeatable read(默認) 重復讀(幻讀)(mysql中用間隙鎖解決了幻讀)
serializable 可串行化(只允許讀)
臟讀
事務A讀取到事務B未提交的數據(如果事務B因某些原因回滾了數據,那么事務A讀取的數據就是不正確的)
不可重復讀(不一致讀)
事務A先讀取某條數據的字段值,然后事務B更改了此條數據的字段值,當事務A在讀取此條數據的字段值時就會和之前的不一樣
幻讀
事務A先讀取表中記錄x條,然后事務B又在此表中增加了(刪除)y條記錄,當事務A再次讀取相同條件的數據時就會發現多了(少了)y條數據
不可重復讀 和 幻讀 的主要區別在于 不重復讀更新數據某條記錄的字段值 幻讀是更新數據的記錄數
設置隔離級別
set transaction isolation level read committed; #接下來的一個事務
set session transaction isolation level read committed; #當前連接的所有事務
set global transaction isolation level read committed; #當前時間點以后的所有事務
set tx_isolation='read-committed';
set session.tx_isolation='read-committed';
set global.tx_isolation='read-committed';
查看隔離級別
select @@tx_isolation;
select @@session.tx_isolation;
select @@global.tx_isolation;
mysql中的鎖
鎖的種類
共享鎖(讀鎖)
排它鎖(寫鎖)
意向鎖(mysql自動的鎖)
鎖的級別
表級鎖(myisam innodb)
頁級鎖(BDB)
行級鎖(innodb)
表鎖
lock table tab_name (read | write); 共享鎖鎖定后其他鏈接可以讀但不可寫,排它鎖鎖定后其他鏈接讀取不到數據(發生阻塞)
lock table tab_name1 (read | write),tab_name2 (read | write)... 多張表加鎖
解除表鎖
unlock tables;
Tip:1.使用表鎖后,只能對鎖定的表進行操作
2.共享鎖所有進程只能進行讀操作
3.排它鎖當前進程可以進行讀寫操作,其他進程會阻塞
行鎖(用在事務中)
1.共享鎖
select * from tab_name where id=1 lock in share mode;
//行級共享鎖在其他事務中可以多次鎖定 修改記h錄時容易發生死鎖(mysql會自動使其中一個事務失敗,避免死鎖)
2.排它鎖
select * from tab_name where id=1 for update;
//同一記錄只能獲得一個排它鎖,其他鏈接(進程)再進行鎖定會發生阻塞
Tip: 排它鎖和共享鎖不允許出現在同一條記錄上(互斥 阻塞)
很少使用的功能
1.SQL_CACHE sql緩存
select sql_cache * from user_table;
select sql_no_cache * from user_table; (不使用緩存)
因為數據表的任何變動都會導致緩存失效,所以適用于變動小的數據,否則反而會增加系統負擔
2.DELAYED 懶插入
insert delayed into user set name='x',age=0;
發送此類指令 mysql會返回ok消息,并將待插入的語句放置到mysql隊列,當沒有任何讀取操作時,才指令從隊列取出執行,期間若是又有讀操作,將會停止,繼續等到沒有任何讀取操作時進行
如果服務器崩潰,會導致還在執行隊列的指令丟失,適合對數據完整要求不高的數據
這樣的好處是,提高插入的速度,客戶端不需要等待太長時間。壞處是,不能返回自動遞增的ID,以及系統崩潰時,MySQL還沒有來得及插入數據的話,這些數據將會丟失
總結
以上是生活随笔為你收集整理的mysql创建表示对属性进行说明_mysql基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 复制表结构到一个新表_MyS
- 下一篇: springboot 异步mysql_s