存儲過程、觸發器和函數

存儲過程、觸發器和函數在數據庫中具有重要的作用,它們可以帶來以下幾個方面的重要性:

  1. 數據一致性和完整性

    • 觸發器和存儲過程可以用于實現數據一致性和完整性約束。通過在數據庫操作(如插入、更新、刪除)發生時自動執行相關邏輯,可以確保數據的正確性,減少錯誤和數據異常。
  2. 業務邏輯封裝

    • 存儲過程和函數可以封裝復雜的業務邏輯,使其在數據庫層面執行。這樣可以減少應用程序的負擔,提高系統性能,并且可以確保在數據庫操作中應用相同的業務規則。
  3. 性能優化

    • 存儲過程和函數在數據庫中預編譯,可以提高執行效率。通過減少與數據庫服務器之間的通信次數和數據傳輸量,可以降低系統的負載,提高響應速度。
  4. 安全性

    • 存儲過程和函數可以實現數據庫訪問的安全性控制。通過限制用戶對數據庫的直接訪問,并通過存儲過程和函數來執行特定操作,可以有效防止惡意操作和未經授權的訪問。
  5. 代碼重用和維護

    • 存儲過程和函數可以被多個應用程序或者查詢重復使用,提高了代碼的重用性。當需要修改業務邏輯時,只需修改存儲過程或函數的代碼,而不需要修改所有調用它們的代碼。

1.創建表

CREATE DATABASE staff;
USE staff;
CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(255),deptId INT,LEVEL INT,avatar BLOB,remark TEXT,PRIMARY KEY(id)
);CREATE TABLE dept(id INT NOT NULL AUTO_INCREMENT,deptName VARCHAR(255),manageId INT,remark VARCHAR(255),PRIMARY KEY(id)
);CREATE TABLE payroll(id INT NOT NULL AUTO_INCREMENT,empId INT,baseSalary DOUBLE,actualSalary DOUBLE,bonus DOUBLE,deductMoney DOUBLE,grantDate DATE,PRIMARY KEY(id)
);CREATE TABLE ask_leave(id INT NOT NULL AUTO_INCREMENT,empId INT,leaveReason TEXT,beginDate DATE,endDate DATE,submitDate DATE,auditId INT,STATUS INT,auditOpinion TEXT,PRIMARY KEY(id)
);

2.編寫存儲過程實現插入員工表:參數為:

員工編號idint
姓名userNamevarchar(225)
出生日期birthDatedate
身份證號idCardvarchar(225)
登錄名稱loginNamevarchar(225)
登錄密碼passwordvarchar(225)
手機號mobilevarchar(225)
電子郵件emailvarchar(225)
部門編號deptIdint
員工級別levelint
員工頭像avatarblob
備注remarktext

存儲過程名稱為:insert_employee

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_employee`(IN `id` int,IN `username` varchar(225),IN `birthDate` date,IN `idCard` varchar(225),IN `loginName` varchar(225),IN `password` varchar(225),IN `mobile` varchar(225),IN `email` varchar(225),IN `deptId` int,IN `level` int,IN `avatar` blob,IN `remark` text
)
BEGINDECLARE cnt INT;SELECT COUNT(*) INTO cnt FROM employee WHERE employee.id = id;IF cnt = 0 THEN INSERT INTO employee(`id`,`username`,`birthDate`,`idCard`,`loginName`,`password`,`mobile`,`email`,`deptId`,`level`,`avatar`,`remark` )VALUES(`id`,`username`,`birthDate`,`idCard`,`loginName`,`password`,`mobile`,`email`,`deptId`,`level`,`avatar`,`remark`);END IF;
END

3.利用存儲過程在員工表中插入記錄.

call insert_employee(1,'小紅','2002-03-14','411423200203141510','xiaohong','123','15238790678','1625376859@qq.com',3,1,NULL,'新員工');
call insert_employee(2,'小橙','2002-02-14','411423200203241511','xiaocheng','123','15238790677','1625376858@qq.com',2,2,NULL,'新員工');

4.創建觸發器。
插入

CREATE TRIGGER `insert_payroll` BEFORE 
INSERT ON `payroll` 
FOR EACH ROW SET new.actualSalary = new.baseSalary + new.bonus - new.deductMoney;

更新

CREATE DEFINER = `root`@`localhost`
TRIGGER `update_payroll` BEFORE 
UPDATE ON `payroll` 
FOR EACH ROW SET new.actualSalary = new.baseSalary + new.bonus - new.deductMoney;

5.在員工表中依據姓名userName建立索引。索引名為:index_userName。

CREATE INDEX index_userName 
ON employee(username);

6.建立員工部門工資視圖(包含員工名稱,部門名稱,基本工資,應發工資,獎金,缺勤扣錢)視圖名稱:v_employee_dept_payroll。

CREATE VIEW v_employee_dept_payroll AS
SELECT username AS 姓名,deptName AS 部門名稱,baseSalary AS 基本工資,actualSalary AS 應發工資,bonus AS 獎金,deductMoney AS 缺勤扣錢
FROM employee,dept,payroll
WHERE employee.id = payroll.empId AND employee.deptId = dept.id;

7.利用觸發器實現插入請假信息時,審核人編號自動填入請假人所在部門的部門經理編號。觸發器名稱為:insert_ask_leave。

CREATE DEFINER = `root`@`localhost` 
TRIGGER `insert_ask_leave` BEFORE 
INSERT ON `ask_leave` 
FOR EACH ROW SET new.auditId = (
SELECT manageId 
FROM employee,dept 
WHERE employee.deptid = dept.id AND new.empid = employee.id
);

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

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

相關文章

盛最多水的容器(雙指針)

解題思路: 1,暴力解法(超時) 我們可以使用兩層for循環進行遍歷。找到那個最大的面積即可,這里我就不寫代碼了,因為寫了也是超時。 2,雙指針法 先定義兩個指針一個在最左端,一個在…

C++ 派生類的引入與特性

一 繼承與派生 從上面的例子可以看出: 繼承:一旦指定了某種事物父代的本質特征,那么它的子代將會自動具有哪些性質。這就是一種樸素的可重用的概念。 派生:而且子代可以擁有父代沒有的特性,這是可擴充的概念。 1 C 的…

Today At Apple 2024.04.15 Phone15 入門

官網: https://www.apple.com/today/Apple 亞洲第一大商店:Apple 靜安零售店現已在上海開幕如下預約課程:下載 Apple Store(不是app store),點擊課程預約筆記:Today At Apple Notes果粉加群 &am…

Mybatis進階詳細用法

目錄 條件構造器 案例 自定義SQL 案例 Service接口 案例 綜合案例 條件構造器 案例 Testvoid testQueryMapper() {// 創建 QueryWrapper 實例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…

uniapp經驗

uniapp-ts模版在前端/vue文件夾下 npx dcloudio/uvmlatest 安裝依賴 之后tsconfig.json會報錯&#xff0c;可以在tsconfig.json文件中"compilerOptions"配置項內添加"ignoreDeprecations": "5.0"&#xff0c;解決。 ### 編譯和運行 uni-app 項目…

Postman基礎功能-變量設置與使用

如果你因失去太陽而流淚&#xff0c;那你也將失去群星了。大家好&#xff0c;在 API 測試的廣袤世界中&#xff0c;Postman 猶如一座閃耀的燈塔&#xff0c;為我們指引著前行的方向。而其中的全局變量、集合變量和環境變量&#xff0c;更是如同隱藏的寶藏&#xff0c;蘊含著巨大…

以太網網絡變壓器型號

Hqst華強盛導讀&#xff1a;以太網網絡變壓器的型號通常由一系列數字和字母組成&#xff0c;其中包括以下信息&#xff1a; 額定電壓&#xff1a;表示變壓器的額定輸入和輸出電壓&#xff0c;通常以伏特&#xff08;V&#xff09;為單位。 額定電流&#xff1a;表示變壓器的額定…

0513_IO7

練習1&#xff1a; 使用消息隊列實現的2個終端之間的互相聊天 并使用信號控制消息隊列的讀取方式&#xff1a; 當鍵盤按ctrlc的時候&#xff0c;切換消息讀取方式&#xff0c;一般情況為讀取指定編號的消息&#xff0c;按ctrlc之后&#xff0c;指定的編號不讀取&#xff0c;讀取…

孩子多大可以接觸python?學習python的好處

孩子接觸Python的年齡并沒有明確的界限&#xff0c;一般來說&#xff0c;6歲以上的孩子可以開始學習Python編程。雖然Python是一門高級編程語言&#xff0c;但它的語法簡單易懂&#xff0c;適合初學者入門。通過學習Python編程&#xff0c;孩子可以培養邏輯思維、創造力和解決問…

電商秒殺系統設計

業務流程 系統架構 系統挑戰 高并發:秒殺活動會在短時間內吸引大量用戶,系統需要能夠處理高峰時期的大量并發請求 庫存同步:在秒殺中,面臨的一個嚴重系統挑戰是如何確保在數以萬計的用戶同時搶購有限的商品時,如何正確、實時地扣減庫存,以防止超賣現象。 防止惡意搶購和…

前端 JS 經典:JS 基礎類型和 typeof

前言&#xff1a;JS 基礎類型就 8 種&#xff0c;這是官方確定的&#xff0c;毋庸置疑。其中原始類型 7 種&#xff0c;對象類型 1 種。而 typeof 關鍵字是用來判斷數據是屬于什么類型的。 1. 原始類型 Number、Boolean、String、BigInt、symbol、Undefined、null typeof 18…

貓頭虎分享已解決Error || ERROR: Failed building wheel for XXX

博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff01;《IDEA開發秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鴻蒙》 …

python設計模式---觀察者模式

觀察者模式是一種行為設計模式&#xff0c;用于定義對象之間的一對多依賴關系&#xff0c;當一個對象的狀態發生變化時&#xff0c;所有依賴它的對象都會得到通知并自動更新。 from abc import ABC, abstractmethod from typing import Listclass Observable:def __init__(sel…

系統定時器(SysTick)

介紹SysTick SysTick結構框圖 時鐘選擇 計數器部分 中斷部分 工作流程 相關寄存器 配置流程 相關庫函數

centos無法tab補全至文件

很奇怪的需求&#xff1a;redhat 7.9版本用cd 只能到目錄&#xff0c;無法到文件 我個人認為不是個問題&#xff0c;但是甲方需求&#xff0c;你懂的 首先&#xff0c;我們要搞清楚tab補全功能的包bash-completion是否安裝&#xff0c;這里肯定是安裝了&#xff0c;不過還是看…

使用vscode時快速生成console.log()

前言&#xff1a;在使用vscode開發進行調試時&#xff0c;我們經常要用到console.log()來調試代碼&#xff0c;有什么好用的辦法來快速生成&#xff0c;答案肯定是有的&#xff0c;下面跟隨我來看一下是不是真的很好用。 安裝插件JavaScript (ES6) code snippets 使用時直接按照…

Python批量輸出圖像的尺寸、格式、模式代碼

import os from PIL import Image # 原始文件夾路徑 original_folder rC:\Users\86182\Desktop\OPENCVyt\yt1 # 遍歷原始文件夾中的圖像 for filename in os.listdir(original_folder): img Image.open(os.path.join(original_folder, filename)) Size img.size # …

你了解手機設備的dpr嗎?它和CSS又有什么聯系?

當我們在前端開發中涉及到devicePixelRatio時&#xff0c;我們實際上在談論屏幕像素密度&#xff0c;即每英寸的像素數。這個屬性告訴我們在一個設備上的一個CSS像素對應多少物理像素。 目錄 知識點概覽 dpr值的計算 dpr的用處 知識點概覽 比如我們新買了一個手機&#xff0…

vue vite 環境非構建包編譯 React 報錯定位

1. 背景 眾所周知&#xff0c;vite 在構建生態的位置&#xff0c;vue 與之更是密切&#xff0c;主流的 vue 庫幾乎都與 vite 捆綁。 但有些 UI 庫 如 private/ui 并沒進行行編譯&#xff0c;而是直接將源碼發布到了 npm 中&#xff0c;無法實現兼容化&#xff0c;需要消費方去…

vs-qt中無法加載qsqlite驅動,但是單獨新建demo測試卻又是正常的。。。

開發環境: Vs2015 + qt5.12 背景: 接手了一個項目,可以編譯過去,也可以運行,, 但是登錄一直失敗,,但是數據庫文件也是正常的。。。 最主要的是環境和同事的是一樣的,,,但是他那邊可以加載成功,我這邊不可以。。 后來單獨在vs中創建了一個demo,用來測試QSqlData…