日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql数据库入门教程(10):标识列和事务

發布時間:2024/9/30 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql数据库入门教程(10):标识列和事务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.標識列

標識列有點類似前文的約束。

又稱為自增長列
含義:可以不用手動的插入值,系統提供默認的序列值
使用方法在插入的列后面 添加關鍵字 AUTO_INCREMENT

特點:
1、標識列必須和主鍵搭配嗎?不一定,但要求是一個key
2、一個表可以有幾個標識列?至多一個!
3、標識列的類型只能是數值型
4、標識列可以通過 SET auto_increment_increment=3;設置步長
可以通過 手動插入值,設置起始值

#1、創建表時設置標識列
在插入的列后面 添加關鍵字 AUTO_INCREMENT

DROP TABLE IF EXISTS tab_identity; CREATE TABLE tab_identity(id INT PRIMARY KEY AUTO_INCREMENT ,#自動增長必須搭配keyNAME 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;

結果 ID2 和ID3 是自動增長的
自動增長的插入時可以寫null,可以不寫

#2、修改自動增長步長

#查看

SHOW VARIABLES LIKE '%auto_increment%';

默認為1
第一個為步長,第二個為起始值,起始值不支持值

修改步長

SET auto_increment_increment=3;

重新插入數據

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;

SHOW VARIABLES LIKE 'autocommit';

可以發現自動提交是開啟的

顯式事務

隱式事務有時候不好,比如我們需要的是兩條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):标识列和事务的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。