mysql視圖表怎么設置約束_MySQL一一sql的視圖、索引、約束

一、視圖

本質上相當于一張**“虛擬表”**,可當作獨立的一張表進行操作(增、刪、改、查)

**????? 作用:**

**?????? a)**可通過權限控制,只將“表中的少數列”暴露給數據庫用戶,而不讓該用戶直接操縱數據庫中“實際表”

**?????? b)**可將常用的,較復雜的SQL在數據庫中預先定義好,使得外部調用不用每次都編寫復雜的SQL語句,直

接當作一張“虛擬表”來調用即可 等等,聽說你們都很喜歡我~那給個小心心00~,為了表揚你們,戳這里有你們想要的完整zl

Customers表中原始數據:

c864bad7a90f551afa8faf62ef03470e.png

Orders表中的原始數據:

b7a01a8bd7a9c277da181cecc07f18de.png

創建“查找運費在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 );

創建成功之后:

ae98279cd4416b9cfe7369376380cd22.png

將該視圖當作一張“獨立的表”進行查詢操作:

1 use edisondb; 2 ?select 客戶ID,客戶名,年齡 from FortyToSixtyFreightCusts;

執行結果如下:

0c77ae39d1d708ab78d8b1d4f6de2805.png

關于SCHEMABINDING選項的一些說明:

**???????? 作用:用“富”字組詞使得視圖中引用的對象不能被刪除,被引用的列不能被刪除或者修改(防止:由于引用的列等被刪除,造成視圖無法使用的情況)**

修改視圖,使其指定SCHEMABINDING選項:

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.”的形式出現,否則會出現:名稱 'customers' 對于架構綁定無效的錯誤)*

嘗試刪除Customers表中的age列:

1 use edisondb; 2 alter table customers drop column age;

執行結果:

**

d4b2b06f96c18b669767adad3237422a.png

**

**? ? 附:可通過執行以下語句查看SQL Server中某對象的定義: ?????**

1 exec sp_helptext 'dbo.FortyToSixtyFreightCusts';

執行結果如下:

17dba1da3285e7f8ba3fb3068d25975d.png

二、約束

**?? 1)檢查約束【通常認為的“約束”】**

創建檢查約束:

1 use edisondb; 2 ?alter table staffinfo 3 ?add constraint ck_StaffID check(StaffID between 5000 and 5999)

成功創建之后:

0d53afb9a171455d2ed7e4388a0dfd76.png

此時執行非法的插入行:

1 use edisondb; 2 ?insert into StaffInfo(StaffID,StaffName,Department) 3 values(6000,'Wade','Dev');

執行結果為:

842f471e7f30f2b60f535c95571d1f58.png

**?? 2)唯一性約束**

StaffInfo表原始數據:

60625f01d3e7336202c86705dc119265.png

創建唯一性約束:

1 use edisondb; 2 ?alter table staffinfo 3 ?add constraint uq_StaffName unique(StaffName);

成功創建后:

65877aaa652e050e7c6616ef58de5436.png

**?注:**唯一性約束創建成功后,是在“鍵”中顯示,而非“約束”中

此時執行非法的插入行:

1 use edisondb; 2 ?insert into StaffInfo(StaffID,StaffName,Department) 3 values(5003,'keven','Dev');

執行結果為:

e29b4451f5e44dbe85a562b8fb13c1f2.png

**說明:**要使某列的值唯一,既可以通過主鍵來實現,也可以通過“唯一性約束”來實現

3)默認約束

創建默認約束:

1 use edisondb; 2 ?alter table staffinfo 3 ?add constraint df_Department default('部門待定') for Department;

成功創建后:

eec4d5e652f06a71aae47b7129c9c77f.png

執行行插入:

1 use edisondb; 2 ?insert into StaffInfo(StaffID,StaffName) 3 values(5003,'Murphy');

執行結果為:

8208372a6e6508deab81ac396fda7bab.png

**注:**主鍵和外鍵也屬于一種約束

三、索引

**? 1.聚集索引**

對應于數據庫中數據文件的物理存儲方式,每張表只能建立一個

**? ?? ? 適用場合:**a)select次數遠大于insert、update的次數(insert、update時需要移動其他數據文件的物理位置) ?????????????? ? ? ?? b)建立聚合索引的列,既不能絕大多數都相同,又不能只有極少數相同(可從類似二維數組查找時間復雜的方式去理解)

創建一個NewOrders表,用于對索引的測試:

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萬條測試數據:

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'

插入數據成功之后,NewOrders表中的部分數據如下:

4d938b414c1aef091157c600faed1888.png

進行查詢測試:

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 '耗時:'+replace(str(datediff(ms,@startDT,getdate())),' ','')+' 毫秒'

執行結果為:

b2134b8a78aa2791fd3156333550c937.png

現在對建立“聚集索引”的表進行測試

刪除表中所有行:

1use edisondb 2truncate table neworders;

在用“桿”字組詞NewOrders表的tradeDate列上創建“聚集索引”:

1use edisondb 2create clustered index tradeDate_NewOrders on NewOrders(tradeDate)

執行結果為:

70955c464313f50489c341e9e2a9e2ea.png

再次插入10萬行數據后,進行測試,結果為:

e995aae663961e573a25476b3968bc02.png

**聚合索引使用的關鍵:**在合適的列建立(通常為:最多用作查詢條件的列)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370646.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Software Development Life Cycle

轉載于:https://www.cnblogs.com/genezhao/p/6879848.html

python中 的用法_詳解python中@的用法

python中的用法 是一個裝飾器&#xff0c;針對函數&#xff0c;起調用傳參的作用。 有修飾和被修飾的區別&#xff0c;function作為一個裝飾器&#xff0c;用來修飾緊跟著的函數&#xff08;可以是另一個裝飾器&#xff0c;也可以是函數定義&#xff09;。 代碼1 結果1 Its fun…

ArrayAndString(數組和字符串)

1.實現一個算法&#xff0c;確定一個字符串的所有字符是否全都不同。假使不允許使用額外的數據結構&#xff0c;又該怎么處理&#xff1f; public class UniqueChars {public static void main(String[] args) {// TODO Auto-generated method stubString string "abcdef…

MyBatis教程– CRUD操作和映射關系–第2部分

為了說明這一點&#xff0c;我們正在考慮以下示例域模型&#xff1a; 會有用戶&#xff0c;每個用戶可能都有一個博客&#xff0c;每個博客可以包含零個或多個帖子。 這三個表的數據庫結構如下&#xff1a; CREATE TABLE user (user_id int(10) unsigned NOT NULL auto_incr…

position 的屬性值

理論上來說&#xff0c;全部 position 的取值有8個 包括&#xff1a;position&#xff1a;static | relative | absolute | fixed | sticky | initial | inherit | unset 其中最常用的是 static 、relative、absolute、fixed 和 sticky initial、inherit、unset 是css的關鍵…

[ JavaScript ] JavaScript 實現繼承.

對于javascript中的繼承&#xff0c;因為js中沒有后端語言中的類式繼承。所以js中的繼承&#xff0c;一般都是原型繼承(prototype)。 function P (name){this.name name;this.say function(){console.log(p);} }function S (name,id){this.id id;this.eat function(){conso…

mysql數據庫應用的權限層級_MySQL數據庫的用戶權限管理

嗨&#xff01;各位小伙伴今天翻了一下歷史記錄MySQL 數據庫還有點內容今天開始我們就來補上吧~用戶權限管理伙伴們要知道&#xff0c;在數據庫方面有兩個方向。一個是數據庫管理員(Database Administrator)簡稱DBA&#xff0c;一個是數據庫開發工程師(Database Developer)&…

linux i2c adapter 增加設備_Linux驅動之I2C驅動架構

一、Linux的I2C體系結構主要由三部分組成&#xff1a;(1) I2C核心提供I2C控制器和設備驅動的注冊和注銷方法&#xff0c;I2C通信方法&#xff0c;與適配器無關的代碼以及探測設備等。(2) I2C控制器驅動(適配器)(3) I2C設備驅動二、重要的結構體i2c_adapter//i2c控制器(適配器)i…

Alpha-end

前言 失心瘋病源10團隊代碼管理github個人感悟 肝不動了&#xff0c;肝不動了。明天如果見不到我&#xff0c;不要太想我。站立會議 隊名&#xff1a;PMS530雨勤&#xff08;組長&#xff09; 今天完成了那些任務 熬夜肝代碼代碼簽入github明天的計劃 肝到凌晨還剩下哪些任務 團…

html 01前沿-web介紹

1. 認識網頁 網頁主要由文字、圖像和超鏈接等元素構成。當然&#xff0c;除了這些元素&#xff0c;網頁中還可以包含音頻、視頻以及Flash等。 2. 瀏覽器&#xff08;顯示代碼&#xff09; 瀏覽器是網頁顯示、運行的平臺&#xff0c;常用的瀏覽器有IE、火狐&#xff08;Firefox…

避免寫慢SQL

最近在整理數據庫中的慢SQL&#xff0c;同時也查詢了相關資料。記錄一下&#xff0c;要學會使用執行計劃來分析SQL。 1. 為查詢緩存優化你的查詢 大多數的MySQL服務器都開啟了查詢緩存。這是提高性最有效的方法之一&#xff0c;而且這是被MySQL的數據庫引擎處理的。當有很多相同…

為什么子孫后代會討厭使用java.util.Stack

在我用無意義的重言式殺死你之前&#xff0c;這是要點 如果您的應用程序接近實時&#xff0c;或者將代碼發送到Mars&#xff0c;則需要保留Java中默認的Stack實現。 根據LinkedList編寫您自己的版本。 同樣&#xff0c;如果您的應用程序是關鍵任務&#xff0c;并且希望堆棧由…

play 連接mysql_Play framework 2.x 連接mysql | 學步園

筆者所使用的系統為64位 windows7。本文假設java1.5版本以上環境已經搭好&#xff0c;play 框架已經下載至本地。首先我們創建一個項目。命令行進入play的目錄命令&#xff1a;play new demo再次輸入項目名字輸入2 選擇java項目創建完成界面OK&#xff0c;一個play框架下的java…

rpm -e --nodeps_微課 | rpm的思維導圖

前導課程&#xff1a;微課 | rpm的查詢、升級與卸載命令本次微課將演示使用xmind繪制rpm思維導圖的過程&#xff0c;包括視頻文字&#xff0c;大約需要你10分鐘。另外&#xff0c;文末還有一則IT冷笑話&#xff0c;學習之余、會心一笑:)這個思維導圖將包含以下內容&#xff1a;…

CentOS7搭建lamp環境

Mysql安裝 CentOS 7 版本將MySQL數據庫軟件從默認的程序列表中移除&#xff0c;用mariadb代替了。MariaDB數據庫管理系統是MySQL的一個分支&#xff0c;主要由開源社區在維護&#xff0c;采用GPL授權許可。開發這個分支的原因之一是&#xff1a;甲骨文公司收購了MySQL后&#x…

border-sizing屬性詳解和應用

box-sizing用于更改用于計算元素寬度和高度的默認的 CSS 盒子模型。它有content-box、border-box和inherit三種取值。inherit指的是從父元素繼承box-sizing表現形式&#xff0c;不再冗贅。1. 屬性講解 content-box 默認值&#xff0c;也是css2.1中的盒子模型。在計算 width和…

Couchbase:使用Twitter和Java創建大型數據集

在播放/演示Couchbase或任何其他NoSQL引擎時&#xff0c;創建大型數據集的一種簡單方法是將Twitter feed注入到數據庫中。 對于這個小應用程序&#xff0c;我正在使用&#xff1a; Couchbase Server 2.0服務器 Couchbase Java SDK &#xff08;將由Maven安裝&#xff09; T…

查找標題已知的窗口句柄,遍歷窗口控件句柄

有了回調函數的概念及上面的例子,我們可以繼續了。其實想要找到一個標題已知的窗口句柄,用一個API函數就可以了:FindWindow. 其函數原形是: function FindWindow(lpClassName, lpWindowName: PChar): HWND; stdcall; lpClassName:窗口類名.如果只知道標題,可以為空.窗口類名可以…

西門子scl語言編程手冊_西門子SCL編程PEEK指令講解

單詞“peek”在英語中表示“偷看&#xff0c;瞥一眼”&#xff0c;在計算機編程中表示“讀取數據”。在西門子SCL編程中&#xff0c;PEEK指令可以用來讀取輸入緩存區(I)、輸出緩存區(Q)、位存儲區(M)及數據塊(DB)中的數據&#xff0c;常用作間接尋址。今天這篇文章&#xff0c;…

HTML第一章:初始HTML

設置ws字體大小&#xff1a;左上角file-->Settings--->在搜索框中輸入font網頁的第一行一定是<!DOCTYPE html>&#xff1a;網頁聲明&#xff0c;代表這個頁面是h5頁面html標簽中的leng"en"&#xff1a;意思是網頁中會用到英文 <meta>&#xff1a;…