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微信名片 "字样,就会出现我的二维码,欢迎沟通探讨。


相关推荐
woshilys15 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi16 分钟前
SQL注入的那些面试题总结
数据库·sql
疯狂飙车的蜗牛1 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
建投数据1 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
远游客07133 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<3 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传