mysql数据库入门教程(10):标识列和事务
一.標(biāo)識(shí)列
標(biāo)識(shí)列有點(diǎn)類似前文的約束。
又稱為自增長(zhǎng)列
含義:可以不用手動(dòng)的插入值,系統(tǒng)提供默認(rèn)的序列值
使用方法在插入的列后面 添加關(guān)鍵字 AUTO_INCREMENT
特點(diǎn):
1、標(biāo)識(shí)列必須和主鍵搭配嗎?不一定,但要求是一個(gè)key
2、一個(gè)表可以有幾個(gè)標(biāo)識(shí)列?至多一個(gè)!
3、標(biāo)識(shí)列的類型只能是數(shù)值型
4、標(biāo)識(shí)列可以通過(guò) SET auto_increment_increment=3;設(shè)置步長(zhǎng)
可以通過(guò) 手動(dòng)插入值,設(shè)置起始值
#1、創(chuàng)建表時(shí)設(shè)置標(biāo)識(shí)列
在插入的列后面 添加關(guān)鍵字 AUTO_INCREMENT
結(jié)果 ID2 和ID3 是自動(dòng)增長(zhǎng)的
自動(dòng)增長(zhǎng)的插入時(shí)可以寫null,可以不寫
#2、修改自動(dòng)增長(zhǎng)步長(zhǎng)
#查看
SHOW VARIABLES LIKE '%auto_increment%';默認(rèn)為1
第一個(gè)為步長(zhǎng),第二個(gè)為起始值,起始值不支持值
修改步長(zhǎng)
重新插入數(shù)據(jù)
SHOW VARIABLES LIKE '%auto_increment%'; SET auto_increment_increment=3;DROP TABLE IF EXISTS tab_identity; CREATE TABLE tab_identity(id INT PRIMARY KEY AUTO_INCREMENT ,NAME VARCHAR(10));INSERT INTO tab_identity(id,NAME) VALUES(1,'yudengwu'); INSERT INTO tab_identity(id,NAME) VALUES(NULL,'john'); INSERT INTO tab_identity(NAME) VALUES('lucy');SELECT * FROM tab_identity;#3、修改表時(shí)設(shè)置標(biāo)識(shí)列
ALTER TABLE 表名 MODIFY COLUMN 列名 INT 鍵 AUTO_INCREMENT;#
ALTER TABLE tab_identity MODIFY COLUMN id INT UNIQUE AUTO_INCREMENT;#設(shè)置唯一鍵#四、修改表時(shí)刪除標(biāo)識(shí)列
直接去掉標(biāo)識(shí)列語(yǔ)法
ALTER TABLE 表名 MODIFY COLUMN 列名 INT ;#
二.事務(wù)
1.事務(wù)的介紹
#TCL
/*
Transaction Control Language 事務(wù)控制語(yǔ)言
事務(wù):
一個(gè)或一組sql語(yǔ)句組成一個(gè)執(zhí)行單元,這個(gè)執(zhí)行單元要么全部執(zhí)行,要么全部不執(zhí)行。
案例解釋事務(wù)
假設(shè) 余總有100萬(wàn)元,余總的女朋友有30萬(wàn)元。今天是情人節(jié),余總要轉(zhuǎn)賬520元給 余總的女朋友。
偽代碼如下:
update 表 set 余總的余額=999480 where name=‘余總’;
update 表 set 余總女朋友的余額=300520 where name=‘余總女朋友’;
假設(shè)在執(zhí)行時(shí)出現(xiàn)意外,只執(zhí)行啦第一條語(yǔ)句,第二條收賬語(yǔ)句未執(zhí)行。
而事務(wù)就是保障 這兩條語(yǔ)句要么全執(zhí)行,要么全部執(zhí)行。
不會(huì)出現(xiàn),這邊轉(zhuǎn)賬啦,那邊收不到。
事務(wù)的特性:
ACID
原子性:一個(gè)事務(wù)不可再分割,要么都執(zhí)行要么都不執(zhí)行
一致性:一個(gè)事務(wù)執(zhí)行會(huì)使數(shù)據(jù)從一個(gè)一致狀態(tài)切換到另外一個(gè)一致狀態(tài)
隔離性:一個(gè)事務(wù)的執(zhí)行不受其他事務(wù)的干擾
持久性:一個(gè)事務(wù)一旦提交,則會(huì)永久的改變數(shù)據(jù)庫(kù)的數(shù)據(jù).
2.事務(wù)的創(chuàng)建
隱式事務(wù)
隱式事務(wù):事務(wù)沒(méi)有明顯的開啟和結(jié)束的標(biāo)記
比如insert、update、delete語(yǔ)句
如下面一條語(yǔ)句就是一個(gè)事務(wù)、
delete from 表 where id =1;
可以發(fā)現(xiàn)自動(dòng)提交是開啟的
顯式事務(wù)
隱式事務(wù)有時(shí)候不好,比如我們需要的是兩條update語(yǔ)句。這時(shí)候就需要顯示事務(wù)啦。
顯式事務(wù):事務(wù)具有明顯的開啟和結(jié)束的標(biāo)記
前提:必須先設(shè)置自動(dòng)提交功能為禁用
set autocommit=0;
步驟1:開啟事務(wù)
set autocommit=0;
start transaction;可選的
步驟2:編寫事務(wù)中的sql語(yǔ)句(select insert update delete)
語(yǔ)句1;
語(yǔ)句2;
…
步驟3:結(jié)束事務(wù)
commit;提交事務(wù)
rollback;回滾事務(wù)
savepoint 節(jié)點(diǎn)名;設(shè)置保存點(diǎn)
事務(wù)開啟演示:
DROP TABLE IF EXISTS account;#創(chuàng)建表 CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(10),balance FLOAT);INSERT INTO account(username ,balance)VALUES ('余總',1000),('余總女友',1000);#做下轉(zhuǎn)賬事務(wù) #第一步開啟事務(wù) SET autocommit=0; START TRANSACTION;#可選的#編寫事務(wù)的語(yǔ)句 UPDATE account SET balance=500 WHERE username='余總'; UPDATE account SET balance=1500 WHERE username='余總女友';#結(jié)束事務(wù) COMMIT;#提交事務(wù)SELECT * FROM account;回滾演示下
#創(chuàng)建表 CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(10),balance FLOAT);INSERT INTO account(username ,balance)VALUES ('余總',1000),('余總女友',1000);#做下轉(zhuǎn)賬事務(wù) #第一步開啟事務(wù) SET autocommit=0; START TRANSACTION;#可選的#編寫事務(wù)的語(yǔ)句 UPDATE account SET balance=1000 WHERE username='余總'; UPDATE account SET balance=1000 WHERE username='余總女友';#結(jié)束事務(wù) ROLLBACK;#回滾事務(wù)SELECT * FROM account;在新的例子中設(shè)置金額為1000,結(jié)果還是顯示500,1500,未改變
回滾如同在下載安裝文件時(shí),在最后一步安裝時(shí)選擇撤銷。
3.事務(wù)的并發(fā)性問(wèn)題
臟讀:如余總給余總女友轉(zhuǎn)賬10萬(wàn)塊錢,已經(jīng)轉(zhuǎn)啦,但余總女友還未點(diǎn)擊收賬,此時(shí)點(diǎn)擊撤銷10萬(wàn)塊錢,則女友看到的轉(zhuǎn)賬信息就是無(wú)效的,這就是臟讀。
不可重復(fù)讀:在臟讀的基礎(chǔ)上,余總女友第一次查看轉(zhuǎn)賬信息是10萬(wàn)塊錢,但是由于余總撤銷啦,第二次查看信息為轉(zhuǎn)賬0元。
幻讀:有一次余總想請(qǐng)余總女友和她室友吃飯,他兜里只有100元錢,于是他和她們就出去啦,過(guò)啦一會(huì)兒由來(lái)啦幾個(gè)她的室友…。他兜里只有100元錢。
4.如何避免事務(wù)的并發(fā)性問(wèn)題
算例1:隔離級(jí)別 read uncommitted ,讀取未提交數(shù)據(jù)
1.>select @@tx_isolation;#查看當(dāng)前支持隔離級(jí)別
set session transaction isolation level read uncommitted;#將隔離級(jí)別設(shè)置為最低,讀未提交
2.先開一個(gè)事務(wù)1,該事務(wù)沒(méi)有提交
3.新建一個(gè)命令行,新的命令行顏色改為綠色
4.開新事務(wù)2
5.在查看中發(fā)現(xiàn)已經(jīng)把余總改為啦john,但事務(wù)一還未提交。這個(gè)讀到的數(shù)據(jù)稱為臟數(shù)據(jù)
6.任務(wù)1回滾
7.再次查看事務(wù)2的數(shù)據(jù),余總又回來(lái)啦。John未再出現(xiàn),這也叫不可重復(fù)讀。
8.提交事務(wù)1 ,事務(wù)2.
算例2:隔離級(jí)別 read committed; 讀取已提交數(shù)據(jù)
set session transaction isolation level read committed; #讀已提交
1.在黑色命令行里修改隔離級(jí)別為讀已提交
2.開啟事務(wù)1,事務(wù)1并未結(jié)束
3.開啟事務(wù)2,事務(wù)2隔離級(jí)別改為相應(yīng)的
set session transaction isolation level read committed;
4.查看,發(fā)現(xiàn) ID=1 的數(shù)未改成高念。
上面read committed;例子避免啦臟讀,但不可重復(fù)讀和幻讀沒(méi)有避免。
5.任務(wù)1提交
6.查看任務(wù)2
ID=1 變啦。
7.提交事務(wù)2.
算例3:隔離級(jí)別 repeatable read; 可重復(fù)性讀
set session transaction isolation level repeatable read;
1.設(shè)置隔離級(jí)別
事務(wù)1開啟,查看原始數(shù)據(jù),將ID=1 的名字改為楊冪,未提交。
在事務(wù)2 查看,發(fā)現(xiàn)id=1并未改變.沒(méi)有出現(xiàn)臟讀
4.事務(wù)1提交
5.再次查看事務(wù)2
id=1并未改變成楊冪,實(shí)現(xiàn)重復(fù)讀功能。
6.提交事務(wù)2 ,再次查看
ID=1 變啦
第三個(gè)可以解決臟讀和不可重讀,幻讀不能解決。
算例4:幻讀演示;
1.開啟事務(wù)1,事務(wù)1中的名字全部修改,事務(wù)1 未提交
2.開啟事務(wù)2,先查看
3.在事務(wù)2插入系數(shù)據(jù),并提交。
4.在事務(wù)1 查看數(shù)據(jù) 發(fā)現(xiàn)出現(xiàn)新的數(shù)據(jù)。
電氣工程的計(jì)算機(jī)萌新,寫博文不容易。如果你覺(jué)得本文對(duì)你有用,請(qǐng)點(diǎn)個(gè)贊支持下,謝謝。
總結(jié)
以上是生活随笔為你收集整理的mysql数据库入门教程(10):标识列和事务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电磁炉加热豆腐脑用什么桶最好?
- 下一篇: 炒粉的家常做法?