MySQL如何使用視圖插入修改刪除數(shù)據(jù)
1. 準備
已有數(shù)據(jù)庫stu,數(shù)據(jù)表student、course、score:
create database stu; use stu; create table student( sid char(4) primary key, sname varchar(20) not null, sex enum('男','女'), birth date, grade year, department enum('信息工程系','化學(xué)工程系','機械電子系') default '信息工程系', addr varchar(50) )charset=utf8mb4; create table course( cno char(2) primary key, cname varchar(20) not null, start int, credit float )charset=utf8mb4; create table score( scid int primary key auto_increment , sid char(4), cno char(2), result float check(result >= 0 and result <= 100) )charset=utf8mb4;
2.創(chuàng)建視圖
create view v1 as select sid,sname,sex,department,year(now())-year(birth) age from student where department='化學(xué)工程系'; create view v2 as select sid,sname,sex,department from student where department='化學(xué)工程系'; create view v3 as select student.sid,sname,course.cno,cname,result from student,score,course where student.sid=score.sid and course.cno=score.cno;
3.插入數(shù)據(jù)
利用v1插入記錄:
insert v1(sid,sname,sex,department)values('8888','張敏敏','女','信息工程系');
插入失敗,錯誤提示:
Error Code: 1471. The target table v1 of the INSERT is not insertable-into
利用v2插入記錄:
insert v2(sid,sname,sex,department)values('8888','張敏敏','女','信息工程系');
插入成功。
v1和v2相比,v1比v2多了個字段計算年齡的表達式y(tǒng)ear(now())-year(birth)。
插入失敗可能原因1:定義視圖的select語句后面有數(shù)學(xué)表達式或聚合函數(shù)。
利用v3插入記錄
insert v3 values('8888','張敏敏','01','大學(xué)英語',90);
Error Code: 1394. Can not insert into join view ‘stu.v3’ without fields list
insert v3(cno,cname) values('55','人工智能');
插入成功
插入失敗可能原因2:視圖是定義在多個表上,通過視圖插入一條記錄可能是在多個表中插入記錄。
定義視圖v4,并在v4上定義視圖v5、v6
create view v4 as select sid,cno,result from score where result>=70 ; create view v5 as select sid,cno,result from v4 where result<=90 with local check option ; create view v6 as select sid,cno,result from v4 where result<=90 with cascaded check option ;
利用v4插入記錄,不管是否滿足result>=70,均可插入:
insert v4 values('0404','01',60); insert v4 values('0404','02',80);
利用v5插入記錄:
insert v5 values('0405','01',60); insert v5 values('0405','02',95); insert v5 values('0405','03',80);
成績?yōu)?0、80均可插入,95插入失?。篍rror Code: 1369. CHECK OPTION failed ‘stu.v5’。因為在v5定義的時候有with local check option,必須滿足視圖v5本身定義的條件result<=90,對v4的條件result>=70不做要求。
with local check option 只要求滿足該視圖本身定義的條件
利用v6插入數(shù)據(jù):
insert v6 values('0406','01',60); insert v6 values('0406','02',95); insert v6 values('0406','03',80);
只有成績?yōu)?0的記錄插入成功,60和95均失敗,因為在定義v6的時候有with cascaded check option,所以v6和v4定義的條件都必須滿足。
with cascaded check option 要求滿足所有視圖和表定義的條件
插入失敗可能原因3:插入記錄不滿足視圖定義的基本條件。
在定義視圖時select語句中含distinct、union、top、group by等短語時,插入記錄也可能失敗,不再舉例。
4.修改記錄、刪除記錄
利用v2修改學(xué)號8888為6688:
update v1 set sid='6688' where sid='8888';
不報錯,不修改數(shù)據(jù)。提示為:0 row(s) affected Rows matched: 0 Changed: 0 Warnings: 0
利用v2刪除8888記錄:
delete from v2 where sid=‘8888';
不報錯、不刪除。
如果修改v2定義去掉department=‘化學(xué)工程系’,則允許修改、允許刪除:
create or replace view v2 as select sid,sname,sex,department from student; update v2 set sid='6688' where sid='8888'; delete from v2 where sid='6688';
利用視圖修改數(shù)據(jù)、刪除數(shù)據(jù)時,不滿足視圖定義條件都不能修改或刪除。不報錯
5.總結(jié):
利用視圖插入數(shù)據(jù)時:
1.定義視圖的select語句后面有數(shù)學(xué)表達式或聚合函數(shù);
2.視圖是定義在多個表上,通過視圖插入一條記錄是在多個表中插入記錄;
3.視圖定義時帶‘with… check option’,不滿足視圖定義的條件;
4.視圖帶distinct、union、top、group by等短語時;
都可能導(dǎo)致插入記錄失敗。
利用視圖修改數(shù)據(jù)、刪除數(shù)據(jù)時,不滿足視圖定義條件都不能修改或刪除。
到此這篇關(guān)于MySQL如何使用視圖插入修改刪除數(shù)據(jù)的文章就介紹到這了,更多相關(guān)MySQL視圖插入修改刪除數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用MySQL函數(shù)實現(xiàn)判斷視頻擴展名的代碼
MySQL擁有強大的自定義函數(shù)功能,如下,我寫了一個用MySQL函數(shù) 判斷視頻地址是否可以手機端播放2012-02-02MySQL中隱式轉(zhuǎn)換的踩坑記錄以及解決方法分享
這篇文章主要和大家分享一個MySQL隱式轉(zhuǎn)換時踩過的坑,差點把服務(wù)器整崩潰了,以及最后的解決辦法。文中的示例代碼講解詳細,感興趣的可以了解一下2022-11-11MySQL實現(xiàn)批量插入以優(yōu)化性能的教程
這篇文章主要介紹了MySQL實現(xiàn)批量插入以優(yōu)化性能的教程,文中給出了運行時間來表示性能優(yōu)化后的對比,需要的朋友可以參考下2015-04-04MySQL插入數(shù)據(jù)與查詢數(shù)據(jù)
這篇文章主要介紹了 MySQL插入數(shù)據(jù)與查詢數(shù)據(jù),缺省插入、缺省插入、缺省插入等各種數(shù)據(jù)插入分享,需要的小伙伴可以參考一下,希望對你有所幫助2022-03-03mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式
前段時間在項目開發(fā)過程中發(fā)現(xiàn)了系統(tǒng)異常,打開日志查看發(fā)現(xiàn)了如下的這個報錯,查找相關(guān)資料終于解決了,這篇文章主要給大家介紹了關(guān)于mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式的相關(guān)資料,需要的朋友可以參考下2024-01-01