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