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


相关推荐
姐姐,我还可以7 分钟前
搭建 MySQL MHA
android·数据库·mysql·adb
caron415 分钟前
SQLite3 使用文档
数据库·sqlite
Gauss松鼠会17 分钟前
GaussDB关键技术原理:高性能(二)
数据库·sql·oracle·架构·database·gaussdb
小绵羊不怕大灰狼18 分钟前
MongoDB数据库 MQL (MongoDB Query Language)语句大全
数据库·mongodb
神秘的土鸡20 分钟前
[Shell编程学习路线]——shell脚本中case语句多分支选择详解
linux·运维·服务器·学习·centos·自动化
wkysdhr25 分钟前
MySQL索引、事物
数据库·mysql
iVictor27 分钟前
升级到 MySQL 8.4,MySQL 启动报错:io_setup() failed with EAGAIN
mysql
fls040836 分钟前
MySQL主从复制与读写分离
数据库·mysql
吹牛不交税1 小时前
阿里云centos7.9 挂载数据盘到 www目录
linux·运维·服务器
96掌门师兄1 小时前
centos挂载新的磁盘
linux·运维·centos