SQL知識整理一:觸發器、儲存過程、變量表、臨時表
<pre name="code" class="javascript">$('#dd2').draggable({
proxy:'clone'
});
一、觸發器
create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,][delete] [with encryption] as {batch | if update (col_name) [{and|or} update (col_name)] }
說明:
1 tr_name :觸發器名稱2 on table/view :觸發器所作用的表。一個觸發器只能作用於一個表
3 for 和after :同義
4 after 與instead of :sql 2000新增專案afrer 與 instead of 的區別
After
在觸發事件發生以後才被啟用,只可以建立在表上
Instead of
代替了相應的觸發事件而被執行,既可以建立在表上也可以建立在檢視上
5 insert、update、delete:啟用觸發器的三種操作,可以同時執行,也可選其一
6 if update (col_name):表明所作的操作對指定列是否有影響,有影響,則啟用觸發器。此外,因為delete 操作只對行有影響
所以如果使用delete操作就不能用這條語句了(雖然使用也不出錯,但是不能啟用觸發器,沒意義)。
7觸發器執行時用到的兩個特殊表:deleted ,inserted
deleted 和inserted 可以說是一種特殊的臨時表,是在進行啟用觸發器時由系統自動生成的,其結構與觸發器作用的表結構是一樣的,只是存放 的資料有差異。
8 說明deleted 與inserted 資料的差異
deleted 與inserted 資料的差異
Inserted 存放進行insert和update 操作後的資料
Deleted 存放進行delete 和update操作前的資料
注意:update 操作相當於先進行delete 再進行insert ,所以在進行update操作時,修改前的資料拷貝一條到deleted 表中,修改後的資料在存到觸發器作用的表的同時,也同時生成一條拷貝到insered表中。
觸發器典型示例
if exists(select name from sysobjects where xtype='tr' and name='tri_updateStudent')
begin
drop trigger tri_UpdateStudent
end
go
create trigger tri_UpdateStudent
on dbo.student
for update
as
if update(Sage)
begin
update student set sage=s.sage+d.sage from student s,deleted d where s.studentid=d.studentid
end
go
二、儲存過程
儲存過程的優點
A、 儲存過程允許標準組件式程式設計
B、 儲存過程能夠實現較快的執行速度
C、 儲存過程減輕網路流量
D、 儲存過程可被作為一種安全機制來充分利用
儲存過程的例項
if exists(select * from sysobjects where xtype='p' and name='proc_Student')begin
drop proc proc_student
end
go
create proc proc_Student
@name varchar(255),
@age varchar(255)
as
begin tran
select * from student where [email protected] and [email protected]
if @@ERROR<>0
begin
rollback tran
insert into student(studentid,sname,sage) values (1,@name,@age)
return 0
end
else
begin
commit tran
select * from student
end
go
exec proc_student '科比',1;
三、表變數
表變數定義:
表變數建立的語法類似於臨時表,區別就在於建立的時候,必須要為之命名。表變數是變數的一種,表變數也分為本地及全域性的兩種,本地表變數的名稱都是以“@”為字首,只有在本地當前的使用者連線中才可以訪問。全域性的表變數的名稱都是以“@@”為字首,一般都是系統的全域性變數,像我們常用到的,如@@Error代表錯誤的號,@@RowCount代表影響的行數。
DECLARE @News table
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO @News (News_id, NewsTitle, NewsContent, NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM @News
四、臨時表
臨時表定義:
臨時表與永久表相似,只是它的建立是在Tempdb中,它只有在一個數據庫連線結束後或者由SQL命令DROP掉,才會消失,否則就會一直存在。臨時表在建立的時候都會產生SQL Server的系統日誌,雖它們在Tempdb中體現,是分配在記憶體中的,它們也支援物理的磁碟,但使用者在指定的磁盤裡看不到檔案。
臨時表分為本地和全域性兩種,本地臨時表的名稱都是以“#”為字首,只有在本地當前的使用者連線中才是可見的,當用戶從例項斷開連線時被刪除。全域性臨時表的名稱都是以“##”為字首,建立後對任何使用者都是可見的,當所有引用該表的使用者斷開連線時被刪除。
CREATE TABLE dbo.#News
(
News_id int NOT NULL,
NewsTitle varchar(100),
NewsContent varchar(2000),
NewsDateTime datetime
)
INSERT INTO dbo.#News (News_id, NewsTitle, NewsContent, NewsDateTime)
VALUES (1,'BlueGreen', 'Austen', 200801, GETDATE())
SELECT News_id, NewsTitle, NewsContent, NewsDateTime FROM dbo.#News
DROP TABLE dbo.[#News]
表變數和臨時表對比總結
特性 |
表變數 |
臨時表 |
作用域 |
當前批處理 |
當前會話,巢狀儲存過程,全域性:所有會話 |
使用場景 |
自定義函式,儲存過程,批處理 |
自定義函式,儲存過程,批處理 |
建立方式 |
DECLARE statement only.只能通過DECLEARE語句建立 |
CREATE TABLE 語句 SELECT INTO 語句. |
表名長度 |
最多128位元組 |
最多116位元組 |
列型別 |
可以使用自定義資料型別 可以使用XML集合 |
自定義資料型別和XML集合必須在TempDb內定義 |
Collation |
字串排序規則繼承自當前資料庫 |
字串排序規則繼承自TempDb資料庫 |
索引 |
索引必須在表定義時建立 |
索引可以在表建立後建立 |
約束 |
PRIMARY KEY, UNIQUE, NULL, CHECK約束可以使用,但必須在表建立時宣告 |
PRIMARY KEY, UNIQUE, NULL, CHECK. 約束可以使用,可以在任何時後新增,但不能有外來鍵約束 |
表建立後使用DDL (索引,列) |
不允許 |
允許. |
資料插入方式 |
INSERT 語句 (SQL 2000: 不能使用INSERT/EXEC). |
INSERT 語句, 包括 INSERT/EXEC. SELECT INTO 語句. |
Insert explicit values into identity columns (SET IDENTITY_INSERT). |
不支援SET IDENTITY_INSERT語句 |
支援SET IDENTITY_INSERT語句 |
Truncate table |
不允許 |
允許 |
析構方式 |
批處理結束後自動析構 |
顯式呼叫 DROP TABLE 語句. |
事務 |
只會在更新表的時候有事務,持續時間比臨時表短 |
正常的事務長度,比表變數長 |
儲存過程重編譯 |
否 |
會導致重編譯 |
回滾 |
不會被回滾影響 |
會被回滾影響 |
統計資料 |
不建立統計資料,所以所有的估計行數都為1,所以生成執行計劃會不精準 |
建立統計資料,通過實際的行數生成執行計劃。 |
作為引數傳入儲存過程 |
僅僅在SQL Server2008, 並且必須預定義 user-defined table type. |
不允許 |
顯式命名物件 (索引, 約束). |
不允許 |
允許,但是要注意多使用者的問題 |
動態SQL |
必須在動態SQL中定義表變數 |
可以在呼叫動態SQL之前定義臨時表 |
用法:無表關聯操作,只作為中間集進行資料處理,建議用表變數;有表關聯,且不能確定資料量大小的情況下,建議用臨時表。
相關推薦
SQL知識整理一:觸發器、儲存過程、變量表、臨時表
<pre name="code" class="javascript">$('#dd2').draggable({ proxy:'clone' }); 一、觸發器 create trigger tr_name on table/view {for
Mysql儲存過程2:變量定義與參數傳遞
變量定義 color ted lec mysq 傳遞 參數傳遞 fault 可選 #儲存過程 中的變量定義 declare 變量名 類型 可選類型 -- 跟建表差不多 create procedure p() begin declare age int de
MySQL:檢視、觸發器、儲存過程、事務
檢視: 檢視,虛擬表 建立虛擬表: # 語法: # create view 虛擬表名稱 as 虛擬表; create view course_and_teacher as select * from course inner join teacher on course.teacher_id =
SQL的綜合案例(觸發器、函式、遊標、儲存過程)
下面是一個學生資訊的建立 在這裡就不建立資料庫了 CREATE TABLE CLASS ( class_id int IDENTITY PRIMARY KEY, --班級ID class_name Varchar(50), --班級名稱 cla
sql server 查看錶、檢視、觸發器、儲存過程等組成sql查詢語句
1. 檢視使用者表 select name from sys.tables select name from sys.objects where type='U' select name from sysobjects where xtype='U' 其中type
SQL Server基礎(三)SQL Server 的儲存過程:什麼是儲存過程、儲存過程有什麼作用、儲存過程的使用方法
一、簡介 網上百度了好幾篇部落格,都沒有說明儲存過程是什麼東西?然後這個東西有什麼用? 從馬克思認識論上來看,我們必須先認識事物是什麼東西(即本質),然後才進一步認識事物是用來幹嘛的(即屬性)。於是,參考了下面的這篇CSDN論壇,和大家分享下,什麼是儲存過程,它又有什麼用。 htt
SQL函式:判斷庫、表、儲存過程等是否存在
----------------- 庫是否存在if exists(select * from master..sysdatabases where name=N'庫名')print 'exists'elseprint 'not exists'----------------- 判斷要建立的表名是否存在if e
第六篇:檢視、觸發器、事務、儲存過程、函式
一 檢視 檢視是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的資料集,併為其命名】,使用者使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用檢視我們可以把查詢過程中的臨時表摘出來,用檢視去實現,這樣以後再想操作該臨時表的資料時就無需重寫複雜的sql了,直接去檢視中查詢即
ORACLE PL/SQL語法應用:遊標,儲存過程,觸發器,函式
--遊標 --do while迴圈 declare cursor c is select * from t_t_student order by id; v_record c%rowtype
SQL server觸發器、儲存過程操作遠端資料庫插入資料,解決伺服器已存在的問題
最近弄了一個小專案,也不是很複雜,需要將一個數據庫的一些資料備份到另外一個庫,不是本地,可能是網路上其他的資料庫,想了一下,用了儲存過程和觸發器。也不是很複雜,首先我需要操作遠端資料庫,於是寫了一個儲存過程: CREATE PROCEDURE sendInfoToRemo
MySQL觸發器、儲存過程、自定義函式、檢視 常用SQL
1.建立一個userinfo表新增記錄時的觸發器 將新增日誌加入到userinfolog 2.建立一個向userinfo表新增記錄的儲存過程 3.根據userinfo表的出生日期欄位 我們將建立一個簡單算得年齡的自定義函式 4.建立一個userinfo的檢視 呼叫年齡函式
前端知識學習一 :CSS基礎
分隔 color html元素 http 方式 瀏覽器 單位 工作 分離 一.CSS概述 css指的是層疊樣式表,樣式定義如何顯示HTML元素,樣式通常存儲在樣式表中, 把樣式添加到HTML4.0中,是為了解決內容和表現分離的問題。外部樣式表通常存儲在css文件
檢視、觸發器、事務、儲存過程、函式,流程控制
檢視 檢視是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的資料集,併為其命名】,使用者使用時只需使用【名稱】即可獲取結果集,可以將該結果集當做表來使用。 使用檢視我們可以把查詢過程中的臨時表摘出來,用檢視去實現,這樣以後再想操作該臨時表的資料時就無需重寫複雜的sql了,直接去檢視中查詢即可,
asp執行sql語句、儲存過程的幾種方法
使用connection物件 會返回一個關閉的recordset記錄集,此記錄集不要再次宣告關閉 建議在update、insert、delete時使用 strCon="provider=sqloledb;data source=servername;initial catalog
sql server 刪除所有 檢視、儲存過程
--刪除檢視: declare mycur cursor local for select [name] from dbo.sysobjects where xtype='V' --宣告遊標 declare @name varchar(100) OPEN mycur --開啟
mysql-檢視、觸發器、事務、儲存過程、函式
目錄 檢視 觸發器 事務 儲存過程 流程控制 一、檢視 檢視是由查詢結果構成的一張虛擬表,和真實的表一樣,帶有名稱的列和行資料 強調:檢視是永久儲存的,但是檢視儲存的不是資料,只是一條sql語句 檢視的特點: 檢視的列可以來自不同的表,是表的抽象和邏輯意義上建立的新關係。
時序資料庫技術體系(一):時序資料儲存模型設計
時序資料庫技術體系中一個非常重要的技術點是時序資料模型設計,不同的時序系統有不同的設計模式,而不同的設計模式對時序資料的讀寫效能、資料壓縮效率等各個方面都有非常重要的影響。這篇文章筆者將會分別針對OpenTSDB、Druid、InfluxDB以及Beringei這四個時序系統中的時序資料模型設計進行
IM開發基礎知識補課(四):正確理解HTTP短連線中的Cookie、Session和Token
1、前言 眾所周之,IM是個典型的快速資料流交換系統,當今主流IM系統(尤其移動端IM)的資料流交換方式都是Http短連線+TCP或UDP長連線來實現。Http短連線主要用於從伺服器讀取各種持久化資訊:比如使用者資訊、聊天曆史記錄、好友列表等等,長連線則是用於實時的聊天訊息
專案整理一:資料庫設計
裝置管理平臺,支援不同裝置種類的管理,如蒸汽表、燃氣表、水錶等。為了滿足這種需求,資料庫設計時,對裝置資訊相關的表的屬性欄位採用的方式時:設定10個double column,10個int column,10個String column,5個date colum