mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束
一、視圖
本質(zhì)上相當(dāng)于一張**“虛擬表”**,可當(dāng)作獨(dú)立的一張表進(jìn)行操作(增、刪、改、查)
**????? 作用:**
**?????? a)**可通過(guò)權(quán)限控制,只將“表中的少數(shù)列”暴露給數(shù)據(jù)庫(kù)用戶,而不讓該用戶直接操縱數(shù)據(jù)庫(kù)中“實(shí)際表”
**?????? b)**可將常用的,較復(fù)雜的SQL在數(shù)據(jù)庫(kù)中預(yù)先定義好,使得外部調(diào)用不用每次都編寫(xiě)復(fù)雜的SQL語(yǔ)句,直
接當(dāng)作一張“虛擬表”來(lái)調(diào)用即可 等等,聽(tīng)說(shuō)你們都很喜歡我~那給個(gè)小心心00~,為了表?yè)P(yáng)你們,戳這里有你們想要的完整zl
Customers表中原始數(shù)據(jù):
Orders表中的原始數(shù)據(jù):
創(chuàng)建“查找運(yùn)費(fèi)在40到60之間的客戶信息”的視圖:
1 use edisondb; 2
3 ?if object_id('FortyToSixtyFreightCusts')is not null
4 drop view FortyToSixtyFreightCusts
5 ?go
6 ?create view FortyToSixtyFreightCusts
7 ?as
8
9 ?select C.custid as '客戶ID',C.name as '客戶名', C.age as '年齡'
10 from customers as C
11 ?where Exists(
12 select *
13 from Orders as O
14 where C.custid=O.custid and (O.freight between 40 and 60)
15 );
創(chuàng)建成功之后:
將該視圖當(dāng)作一張“獨(dú)立的表”進(jìn)行查詢操作:
1 use edisondb; 2 ?select 客戶ID,客戶名,年齡 from FortyToSixtyFreightCusts;
執(zhí)行結(jié)果如下:
關(guān)于SCHEMABINDING選項(xiàng)的一些說(shuō)明:
**???????? 作用:用“富”字組詞使得視圖中引用的對(duì)象不能被刪除,被引用的列不能被刪除或者修改(防止:由于引用的列等被刪除,造成視圖無(wú)法使用的情況)**
修改視圖,使其指定SCHEMABINDING選項(xiàng):
1 alter view FortyToSixtyFreightCusts with schemabinding
2 ?as
3
4 ?select C.custid as '客戶ID',C.name as '客戶名', C.age as '年齡'
5 ?from dbo.customers as C
6 ?where Exists(
7 select O.custid
8 from dbo.Orders as O
9 where C.custid=O.custid and (O.freight between 40 and 60)
10 );
11
go
(以上表名,一定要以“dbo.”的形式出現(xiàn),否則會(huì)出現(xiàn):名稱 'customers' 對(duì)于架構(gòu)綁定無(wú)效的錯(cuò)誤)*
嘗試刪除Customers表中的age列:
1 use edisondb; 2 alter table customers drop column age;
執(zhí)行結(jié)果:
**
**
**? ? 附:可通過(guò)執(zhí)行以下語(yǔ)句查看SQL Server中某對(duì)象的定義: ?????**
1 exec sp_helptext 'dbo.FortyToSixtyFreightCusts';
執(zhí)行結(jié)果如下:
二、約束
**?? 1)檢查約束【通常認(rèn)為的“約束”】**
創(chuàng)建檢查約束:
1 use edisondb; 2 ?alter table staffinfo 3 ?add constraint ck_StaffID check(StaffID between 5000 and 5999)
成功創(chuàng)建之后:
此時(shí)執(zhí)行非法的插入行:
1 use edisondb; 2 ?insert into StaffInfo(StaffID,StaffName,Department) 3 values(6000,'Wade','Dev');
執(zhí)行結(jié)果為:
**?? 2)唯一性約束**
StaffInfo表原始數(shù)據(jù):
創(chuàng)建唯一性約束:
1 use edisondb; 2 ?alter table staffinfo 3 ?add constraint uq_StaffName unique(StaffName);
成功創(chuàng)建后:
**?注:**唯一性約束創(chuàng)建成功后,是在“鍵”中顯示,而非“約束”中
此時(shí)執(zhí)行非法的插入行:
1 use edisondb; 2 ?insert into StaffInfo(StaffID,StaffName,Department) 3 values(5003,'keven','Dev');
執(zhí)行結(jié)果為:
**說(shuō)明:**要使某列的值唯一,既可以通過(guò)主鍵來(lái)實(shí)現(xiàn),也可以通過(guò)“唯一性約束”來(lái)實(shí)現(xiàn)
3)默認(rèn)約束
創(chuàng)建默認(rèn)約束:
1 use edisondb; 2 ?alter table staffinfo 3 ?add constraint df_Department default('部門(mén)待定') for Department;
成功創(chuàng)建后:
執(zhí)行行插入:
1 use edisondb; 2 ?insert into StaffInfo(StaffID,StaffName) 3 values(5003,'Murphy');
執(zhí)行結(jié)果為:
**注:**主鍵和外鍵也屬于一種約束
三、索引
**? 1.聚集索引**
對(duì)應(yīng)于數(shù)據(jù)庫(kù)中數(shù)據(jù)文件的物理存儲(chǔ)方式,每張表只能建立一個(gè)
**? ?? ? 適用場(chǎng)合:**a)select次數(shù)遠(yuǎn)大于insert、update的次數(shù)(insert、update時(shí)需要移動(dòng)其他數(shù)據(jù)文件的物理位置) ?????????????? ? ? ?? b)建立聚合索引的列,既不能絕大多數(shù)都相同,又不能只有極少數(shù)相同(可從類似二維數(shù)組查找時(shí)間復(fù)雜的方式去理解)
創(chuàng)建一個(gè)NewOrders表,用于對(duì)索引的測(cè)試:
1 use edisondb; 2 3 create table NewOrders 4 ( orderID numeric(18, 0) identity(1,1) not null, 5 custID numeric(18, 0) not null, 6 empID numeric(18, 0) not null, 7 tradeDate datetime not null 8 );
在NewOrders表中插入10萬(wàn)條測(cè)試數(shù)據(jù):
1 use edisondb;
2 set nocount on
3 declare @i numeric(18,0)
4 declare @custid numeric(18,0)
5 declare @empid numeric(18,0)
6 declare @tradeDateTime datetime
7 begin
8 set @i=0
9 set @custid=100000
10 set @empid=500000
11 set @tradeDateTime=getdate()
12 while @i<100000
13 begin
14 insert into neworders(custID,empID,tradeDate)
15 values(@custid,@empid,@tradeDateTime)
16 set @i=@i+1
17 set @custid=@custid+1
18 set @empid=@empid+1
19 if (@i%1000)=0
20 set @tradeDateTime=dateadd(day,1,@tradeDateTime)
21 end
22 end
23 print 'Insert data over'
插入數(shù)據(jù)成功之后,NewOrders表中的部分?jǐn)?shù)據(jù)如下:
進(jìn)行查詢測(cè)試:
1 use edisondb; 2 declare @startDT datetime 3 set @startDT=getdate() 4 select * from neworders where tradedate> dateadd(day,10,'2011-9-20') 5 print '耗時(shí):'+replace(str(datediff(ms,@startDT,getdate())),' ','')+' 毫秒'
執(zhí)行結(jié)果為:
現(xiàn)在對(duì)建立“聚集索引”的表進(jìn)行測(cè)試
刪除表中所有行:
1use edisondb 2truncate table neworders;
在用“桿”字組詞NewOrders表的tradeDate列上創(chuàng)建“聚集索引”:
1use edisondb 2create clustered index tradeDate_NewOrders on NewOrders(tradeDate)
執(zhí)行結(jié)果為:
再次插入10萬(wàn)行數(shù)據(jù)后,進(jìn)行測(cè)試,結(jié)果為:
**聚合索引使用的關(guān)鍵:**在合適的列建立(通常為:最多用作查詢條件的列)
總結(jié)
以上是生活随笔為你收集整理的mysql视图表怎么设置约束_MySQL一一sql的视图、索引、约束的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 原神女仆毕业武器是什么
- 下一篇: mysql数据库应用的权限层级_MySQ