Mysql存储过程用法:使用存储过程编程,来判断数据库中数据表中的字段是否重复,避免重复插入记录

目录

一、mysql的存储过程介绍

[二、. 创建存储过程](#二、. 创建存储过程)

1、准备

2、创建插入记录的存储过程

[三. 调用存储过程](#三. 调用存储过程)

[四. 删除存储过程](#四. 删除存储过程)

[五. 修改存储过程,避免数据表的姓名出现重复](#五. 修改存储过程,避免数据表的姓名出现重复)

1、修改存储过程的方式

2、重新创建存储过程

[六. 验证新的存储过程](#六. 验证新的存储过程)

1、插入新的记录

2、插入名称相同的记录

(1)直接调用存储过程插入名称相同的记录

(2)只对记录名进行修改


一、mysql的存储过程介绍

MySQL的存储过程是一组为了完成特定功能的SQL语句集合,它被编译并存储在数据库中,可被数据库的客户端程序反复调用。存储过程由SQL语句组成,包括声明、SQL语句、控制结构以及异常处理等。存储过程可以提高SQL代码的重用性,减少网络通信量,提高性能,并允许数据库管理员和开发人员在数据库层面上实施复杂的业务逻辑。

类似于系统的shell脚本,或者编程语言中的函数等。

二、. 创建存储过程

1、准备

假设我们有一个名为`trainees`的表,并且我们想要创建一个存储过程来插入一个新的学员记录。

首先,确保`trainees`表存在,并且有一个合适的结构。例如:

CREATE TABLE trainees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    grade VARCHAR(10)
);

接着,在navicat中实际操作,效果如下图所示:

最后,查看表是否存在,操作如下图示:

2、创建插入记录的存储过程

确认数据表存在后,我们可以创建一个存储过程来插入新的学员记录:

DELIMITER //
CREATE PROCEDURE InsertTrainee(IN p_name VARCHAR(50), IN p_age INT, IN p_grade VARCHAR(10))

BEGIN
    INSERT INTO trainees (name, age, grade) VALUES (p_name, p_age, p_grade);
    SELECT 'New trainee inserted successfully!';
END //
DELIMITER ;

在这个例子中,我们使用了`DELIMITER`来改变命令提示符,以便在存储过程中使用多个语句。`InsertTrainee`是存储过程的名称,它接受三个输入参数:`p_name`、`p_age`和`p_grade`。

在存储过程的主体中,我们使用这些参数来插入一个新的学员记录,并返回一个消息确认插入成功。

实际操作如下图所示:

接着,可以在navicat中查看数据库的"函数"选项,选中"InsertTrainee",如下图示,表明存储过程正确的创建好了。

三. 调用存储过程

一旦创建了存储过程,就可以通过指定存储过程名和参数(如果有的话)来调用它。以下是如何调用上面创建的`InsertTrainee`存储过程的例子:

CALL InsertTrainee('John Doe', 20, 'A');

这将在`trainees`表中插入一个新的学员记录,并返回一条消息确认插入成功。

在navicat中查看数据表,如下图所示:

可以看出,数据记录插入成功。

四. 删除存储过程

如果不再需要某个存储过程,可以使用`DROP PROCEDURE`语句来删除它:

DROP PROCEDURE IF EXISTS InsertTrainee;

这将会删除名为`InsertTrainee`的存储过程(如果存在的话)。使用`IF EXISTS`子句可以防止在存储过程不存在时产生错误。

五. 修改存储过程,避免数据表的姓名出现重复

1、修改存储过程的方式

如果需要修改存储过程,可以使用`ALTER PROCEDURE`语句。但是,请注意,直接修改存储过程可能会导致意外的副作用。通常,更好的做法是先删除旧的存储过程,然后创建一个新的。以下是如何删除和重新创建存储过程的例子:

-- 删除存储过程

DROP PROCEDURE IF EXISTS InsertTrainee;

实际操作如下:

2、重新创建存储过程

重新编写存储过程如下:

bash 复制代码
-- 重新创建存储过程(假设想要修改它)
DELIMITER //
CREATE PROCEDURE InsertTrainee(IN p_name VARCHAR(50), IN p_age INT, IN p_grade VARCHAR(10))
BEGIN
    -- 假设我们添加了一些额外的逻辑
    DECLARE trainee_exists INT;
    SELECT COUNT(*) INTO trainee_exists FROM trainees WHERE name = p_name;
    IF trainee_exists = 0 THEN
        INSERT INTO trainees (name, age, grade) VALUES (p_name, p_age, p_grade);
        SELECT 'New trainee inserted successfully!';
    ELSE
        SELECT 'Trainee with the same name already exists.';
    END IF;
END //
DELIMITER ;

这样,我们修改存储过程的代码,也就是添加了一些额外的逻辑来检查是否已经存在具有相同姓名的学员。

若不存在,直接添加记录;若已经存在,提示"... the same name already exists.",不做任何添加。

接着,可以在navicat中查看数据库的"函数"选项,选中"InsertTrainee",如下图示,表明新的存储过程正确的创建好了。

六. 验证新的存储过程

1、插入新的记录

结果1提示插入成功,然后在navicat中输入select语句查询数据表,结果如下:

可以看出,新的记录插入成功完成。

2、插入名称相同的记录

(1)直接调用存储过程插入名称相同的记录

直接调用存储过程插入名称相同的记录,但是其他字段不同的记录,如下所示:

结果1显示:Trainee with the same name already exists.说明有同名的记录存在。

显然插入记录没有成功。

(2)只对记录名进行修改

最对新的记录名字修改,其他不改动,操作如下图所示:

结果1显示:新的记录插入成功。

查看目前表中记录,如下图所示,新的记录已经存在,显然重新插入新的记录成功。


文章正下方可以看到我的联系方式:鼠标"点击" 下面的 "威迪斯特-就是video system微信名片 "字样,就会出现我的二维码,欢迎沟通探讨。


相关推荐
云飞云共享云桌面2 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
师太,答应老衲吧2 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Peter_chq2 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml43 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
Channing Lewis3 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
追风林3 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
一坨阿亮3 小时前
Linux 使用中的问题
linux·运维
毕业设计制作和分享4 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil274 小时前
Redis - String 字符串
数据库·redis·缓存
dsywws4 小时前
Linux学习笔记之vim入门
linux·笔记·学习