MySQL存储过程


崔爽备注: 分5步执行,

  1. DELIMITER //
  2. 中间这一大段
  3. DELIMITER ;
  4. – 调用存储过程
    CALL UpdateUserLocations(); (大概要几分钟到更久)
  5. 上一条执行结束后,告知志刚。ok的话执行 DROP PROCEDURE IF EXISTS UpdateUserLocations;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

-- 刷新users表中的location字段的数据
DELIMITER //

CREATE PROCEDURE UpdateUserLocations()
BEGIN
DECLARE min_id INT;
DECLARE max_id INT;
DECLARE batch_size INT DEFAULT 1000;
DECLARE done INT DEFAULT 0;

-- 获取用户ID的最小值和最大值
SELECT MIN(id), MAX(id) INTO min_id, max_id FROM taskonstage.users;

-- 分段更新users表中的location字段
WHILE min_id <= max_id DO
UPDATE taskonstage.users u
INNER JOIN (
SELECT
uc.user_id,
uc.location
FROM
taskonstage.user_campaigns uc
INNER JOIN (
SELECT
user_id,
MAX(update_time) AS latest_time
FROM
taskonstage.user_campaigns
WHERE
user_id BETWEEN min_id AND min_id + batch_size - 1
AND location <> ''
GROUP BY
user_id
) latest_uc ON uc.user_id = latest_uc.user_id AND uc.update_time = latest_uc.latest_time
WHERE uc.location <> ''
) latest_location ON u.id = latest_location.user_id
SET u.location = latest_location.location
WHERE u.id BETWEEN min_id AND min_id + batch_size - 1;

-- 加入短暂的休眠时间
DO SLEEP(0.1);

SET min_id = min_id + batch_size;
END WHILE;
END //

DELIMITER ;

-- 调用存储过程
CALL UpdateUserLocations();

-- 删除存储过程(可选)
DROP PROCEDURE IF EXISTS UpdateUserLocations;


要判断 MySQL 是否支持存储过程,可以使用以下几种方法:

  1. 查看 MySQL 版本:
    MySQL 5.0 及更高版本都支持存储过程。可以使用以下命令查看 MySQL 版本:
1
SELECT VERSION();

如果版本号是 5.0 或更高,那么 MySQL 就支持存储过程。

  1. 使用 SHOW PROCEDURE STATUS 命令:
    可以使用以下命令查看系统中是否存在任何存储过程:
1
SHOW PROCEDURE STATUS;

如果返回结果中有记录,说明 MySQL 支持存储过程。

  1. 尝试创建一个简单的存储过程:
    你可以尝试创建一个简单的存储过程,看是否能够成功执行。例如:
1
2
3
4
5
6
7
8
DELIMITER //
CREATE PROCEDURE test_proc()
BEGIN
SELECT 'Hello, World!';
END //
DELIMITER ;

CALL test_proc();

如果能够成功创建并执行存储过程,说明 MySQL 支持存储过程。

总之,通过查看 MySQL 版本、使用 SHOW PROCEDURE STATUS 命令,或尝试创建一个简单的存储过程,都可以判断 MySQL 是否支持存储过程。

文章目录