mysql 外键和事务_Mysql (五)事务和外键
一、 什么是事務(wù):簡(jiǎn)單說(shuō),所謂事務(wù)就是一組操作,這組操作要么都成功執(zhí)行,要么都不執(zhí)行。
二、 事務(wù)的使用流程
1. 第一步:開(kāi)啟事務(wù),start transaction;
2. 第二步:正常操作SQL語(yǔ)句,但是這些SQL語(yǔ)句被沒(méi)有真正更改數(shù)據(jù)庫(kù)的數(shù)據(jù)信息
3. 第三步:提交事務(wù),commit,當(dāng)提交事務(wù)后,SQL語(yǔ)句會(huì)被真正執(zhí)行,數(shù)據(jù)庫(kù)中的信息會(huì)被改變,注意如果要取消第二步的所有操作,那么可以使用rollback(回滾)語(yǔ)句
三、 事務(wù)的特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
1. 原子性:一個(gè)事務(wù)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
2. 一致性:數(shù)據(jù)在事務(wù)前后保持一致
3. 隔離性:某個(gè)事務(wù)的操作對(duì)其他事務(wù)不可見(jiàn)
4. 持久性:當(dāng)事務(wù)完成后,其影響應(yīng)該保留下來(lái),不能撤銷(xiāo)
四、 事務(wù)使用的注意事項(xiàng):存儲(chǔ)引擎必須是innodb,因?yàn)閙yisam不支持事務(wù)
create table account(
id int,
name char(10),
money int
);
insert into account values
(1,'張三',3000),
(2,'李四',3000);
update account set money = money - 500 where id = 1;
update account set money =money +500 where id =2;
start transaction; 開(kāi)啟
update account set money = money - 500 where id = 1;
update account set money =money +500 where id =2;
commit;
五、 視圖
1. 定義:視圖是由查詢結(jié)果形成的一張?zhí)摂M表
2. 格式:create view 視圖名稱 as select語(yǔ)句;
create view v as select * from student where ssex ='男';
select * from department left join employee on department.did = employee.did;
select aname,id,age from (select employee.*,aname from department left join employee on department.did = employee.did) as a;
create view v2 as select * from department left join employee on department.did = employee.did; 不允許有重復(fù)字段,報(bào)錯(cuò)
create view v2 as select employee.*,aname from department left join employee on department.did = employee.did;
select * from v2;
select * from v2 where did =1;
3. 什么時(shí)候用視圖:如果某個(gè)查詢結(jié)果出現(xiàn)的非常頻繁,也就是,要經(jīng)常拿這個(gè)查詢結(jié)果做子查詢
4. 視圖的作用
(1)簡(jiǎn)化操作,不用進(jìn)行多表查詢
(2)可以進(jìn)行權(quán)限控制把表的權(quán)限封閉,但是開(kāi)放相應(yīng)的視圖權(quán)限,視圖里只開(kāi)放部分?jǐn)?shù)據(jù)列。比如我們的goods商品表,我們不想讓別人看到我們的銷(xiāo)售價(jià)格,這時(shí)候我們就可以把查看商品表的權(quán)限封閉,創(chuàng)建一張視圖create view showGoods as select goods_id,goods_name from goods;不出現(xiàn)銷(xiāo)售價(jià)格列就可以了。
5. 修改視圖:alter view 視圖名 as select語(yǔ)句;
6. 刪除視圖:drop view 視圖名1,視圖名2…;
7. 視圖與基本表的關(guān)系
(1) 視圖是表的查詢結(jié)果,基本表的數(shù)據(jù)變了,會(huì)影響視圖的結(jié)果
(2)從單表中獲取的視圖的增刪改會(huì)影響基本表
(3) 多表視圖時(shí),可以通過(guò)視圖給某個(gè)表插入數(shù)據(jù)
(4)多表視圖時(shí),不可以通過(guò)視圖刪除數(shù)據(jù)
(5)多表視圖時(shí),可以通過(guò)視圖更改數(shù)據(jù),注意:在更改時(shí),被更改的數(shù)據(jù)必須是在視圖中有所體現(xiàn)的,如果在視圖中沒(méi)有體現(xiàn)出來(lái),那么修改的語(yǔ)法沒(méi)有錯(cuò)誤,但是真實(shí)表中的數(shù)據(jù)不會(huì)被改變
注意:有些視圖時(shí)不可以更新的,如包含distinct、group by、having、union、union all、聚合函數(shù)等
select s1.*,cno,degree from s1 inner join s2 on s1.sno = s2.sno;
create view vv as select s1.*,cno,degree from s1 inner join s2 on s1.sno = s2.sno;
insert into vv values (111,'aaa','女','2018-01-01 00:00:00',99999,'6-110',100);
多表查詢不行
insert into vv (sno,sname,ssex,sbirthday,class) values (111,'aaa','女','2018-01-01 00:00:00',99999);
插入成功,但跟誰(shuí)都連不上,沒(méi)有。
select * from s1;
delete * from vv where sno =111; 4)多表視圖時(shí),不可以通過(guò)視圖刪除數(shù)據(jù)
update vv set sname = 'bbb' where sno =111; 沒(méi)變
update vv set ssex = '男' where sno =111; 還是沒(méi)變
在更改時(shí),被更改的數(shù)據(jù)必須是在視圖中有所體現(xiàn)的,如果在視圖中沒(méi)有體現(xiàn)出來(lái),那么修改的語(yǔ)法沒(méi)有錯(cuò)誤,但是真實(shí)表中的數(shù)據(jù)不會(huì)被改變
update vv set sname = 'ok' where sno =103; 變了
注意:有些視圖時(shí)不可以更新的,如包含distinct、group by、having、union、union all、聚合函數(shù)等
select * from s1;
alter view vv as select * from s1 union select * from s1;
update vv set sname = 'ok2' where sno =107; 不可修改
六、 MySQL常見(jiàn)操作
1. 創(chuàng)建用戶:Create user ‘用戶名’@’允許登錄的地址/服務(wù)器’ identified by ‘密碼’
2. 刪除用戶:drop user ‘用戶名’@’服務(wù)器地址’;注意:需要管理員才可以刪除
3. 更改密碼
1) 用戶更改自己的密碼:Set password=password(‘密碼’);
2) 管理員更改用戶密碼:Set password for ‘用戶名’@’允許登錄的地址’=password(‘密碼’);
4. 為用戶授予權(quán)限
1) 格式:grant 權(quán)限1,權(quán)限2.. on 某庫(kù).某個(gè)對(duì)象 to ‘用戶名’@’允許登錄的位置’ 【identified by ‘密碼’】;
2) 說(shuō)明:
l權(quán)限列表,就是,多個(gè)權(quán)限的名詞,相互之間用逗號(hào)分開(kāi),比如: select, insert, update
l也可以寫(xiě):all
l某庫(kù).某個(gè)對(duì)象,表示,給指定的某個(gè)數(shù)據(jù)庫(kù)中的某個(gè)“下級(jí)單位”賦權(quán);
l下級(jí)單位有:表名,視圖名等
l其中,有2個(gè)特殊的語(yǔ)法:
*.*: 代表所有數(shù)據(jù)庫(kù)中的所有下級(jí)單位;
某庫(kù).* :代表指定的該庫(kù)中的所有下級(jí)單位;
3,【identified by ‘密碼’】是可省略部分,如果不省略,就表示賦權(quán)的同時(shí),也去修改它的密碼;
但:如果該用戶不存儲(chǔ),此時(shí)其實(shí)就是創(chuàng)建一個(gè)新用戶;并此時(shí)就必須設(shè)置其密碼了
5. 剝奪權(quán)限:revoke 權(quán)限列表 on 某庫(kù).某個(gè)對(duì)象 from ‘用戶名’@’允許登錄的位置’
七、 忘記登錄密碼的解決方法
1. 進(jìn)入命令行界面,輸入net stop mysql
2. mysqld --skip-grant-tables
3. 此時(shí)可以免密碼登錄:mysql -u root –p
4. 登錄后設(shè)置新密碼:update mysql.user set authentication_string=password('msh8888') where user='root' and Host = 'localhost';
5. 刷新權(quán)限表flush privileges;
八、 SQL語(yǔ)句的分類(lèi)
1. 數(shù)據(jù)定義語(yǔ)言(DDL):用于創(chuàng)建、修改、和刪除數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)結(jié)構(gòu),如:
1) 創(chuàng)建和刪除數(shù)據(jù)庫(kù)(CREATE DATABASE || DROP DATABASE);
2) 創(chuàng)建、修改、重命名、刪除表(CREATE TABLE || ALTER TABLE|| RENAME TABLE||DROP TABLE);
3) 創(chuàng)建和刪除索引(CREATEINDEX || DROP INDEX)
2. 數(shù)據(jù)查詢語(yǔ)言(DQL):從數(shù)據(jù)庫(kù)中的一個(gè)或多個(gè)表中查詢數(shù)據(jù)(SELECT)
3. 數(shù)據(jù)操作語(yǔ)言(DML):修改數(shù)據(jù)庫(kù)中的數(shù)據(jù),包括插入(INSERT)、更新(UPDATE)和刪除(DELETE)
4. 數(shù)據(jù)控制語(yǔ)言(DCL):用于對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),如:
1) 給用戶授予訪問(wèn)權(quán)限(GRANT);
2) 取消用戶訪問(wèn)權(quán)限(REMOKE)
總結(jié)
以上是生活随笔為你收集整理的mysql 外键和事务_Mysql (五)事务和外键的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 春雨润无声是哪首诗 春雨润无声是哪首诗介
- 下一篇: VIVO手机解锁密码忘记了怎么办