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


相关推荐
没书读了17 分钟前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i1 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl1 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502771 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空1 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
朝九晚五ฺ2 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream2 小时前
Linux的桌面
linux
Oak Zhang2 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
xiaozhiwise2 小时前
Makefile 之 自动化变量
linux