MySQL Stored Procedure To Insert Test Record
Posted seliote
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL Stored Procedure To Insert Test Record相关的知识,希望对你有一定的参考价值。
Create Table
create.sql
-- ------------------------------------------------------------------------------------------------
-- Target: mariadb Ver 15.1 Distrib 10.4.10-MariaDB, for Linux (x86_64) using readline 5.1
-- Usage: mariadb -uroot -p < ${path_to_sql}/create.sql
-- ------------------------------------------------------------------------------------------------
-- Create database --------------------------------------------------------------------------------
CREATE DATABASE `ticket` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ------------------------------------------------------------------------------------------------
-- Create user ------------------------------------------------------------------------------------
GRANT INSERT, UPDATE, DELETE ON `ticket`.* TO `tkt`@`%` IDENTIFIED BY '1234qwer%^&*';
FLUSH PRIVILEGES;
-- ------------------------------------------------------------------------------------------------
-- Change database --------------------------------------------------------------------------------
USE `ticket`;
-- ------------------------------------------------------------------------------------------------
-- Create tables ----------------------------------------------------------------------------------
CREATE TABLE `user_info`
(
`uuid` CHAR(36) NOT NULL COMMENT 'To distinguish a record',
`user_id` VARCHAR(16) NOT NULL COMMENT 'User id to display and search for user',
`nickname` VARCHAR(16) NOT NULL COMMENT 'User nickname to display',
`gender` TINYINT NOT NULL DEFAULT 0 COMMENT '0 is unknown, 1 is male, 2 is female',
`deleted` BOOL NOT NULL DEFAULT FALSE COMMENT 'If record had delete is true, else if false',
`create_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Record create datetime',
`create_user` VARCHAR(16) NOT NULL DEFAULT 'system' COMMENT 'Record create user',
`update_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Record update datetime',
`update_user` VARCHAR(16) NOT NULL DEFAULT 'system' COMMENT 'Record update user',
PRIMARY KEY (`uuid`),
UNIQUE KEY `user_id` (`user_id`)
);
CREATE TABLE `login_token`
(
`uuid` CHAR(36) NOT NULL COMMENT 'To distinguish a record',
`intl_tel_code` VARCHAR(3) NOT NULL NOT NULL COMMENT 'International telephone code, use for login',
`tel_num` VARCHAR(11) NOT NULL COMMENT 'User telephone number, use for login',
`password` VARCHAR(300) NOT NULL COMMENT 'Password for login with hash',
`user_uuid` CHAR(36) NOT NULL COMMENT 'Login token related user id',
`deleted` BOOLEAN NOT NULL DEFAULT FALSE COMMENT 'If record had delete is true, else if false',
`create_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Record create datetime',
`create_user` VARCHAR(16) NOT NULL DEFAULT 'system' COMMENT 'Record create user',
`update_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Record update datetime',
`update_user` VARCHAR(16) NOT NULL DEFAULT 'system' COMMENT 'Record update user',
PRIMARY KEY (`uuid`),
FOREIGN KEY `user_uuid` (`user_uuid`) REFERENCES `user_info` (uuid),
KEY `user_tel_num` (`intl_tel_code`, `tel_num`)
) ENGINE = InnoDB COMMENT 'use for user login check id and password';
-- ------------------------------------------------------------------------------------------------
Destroy Database
destroy.sql
-- ------------------------------------------------------------------------------------------------
-- Target: mariadb Ver 15.1 Distrib 10.4.10-MariaDB, for Linux (x86_64) using readline 5.1
-- Usage: mariadb -uroot -p < ${path_to_sql}/destroy.sql
-- ------------------------------------------------------------------------------------------------
-- Drop database ----------------------------------------------------------------------------------
DROP DATABASE IF EXISTS `ticket`;
-- ------------------------------------------------------------------------------------------------
-- Drop user --------------------------------------------------------------------------------------
DROP USER IF EXISTS `tkt`@`%`;
FLUSH PRIVILEGES;
-- ------------------------------------------------------------------------------------------------
Insert Record
init.sql
-- ------------------------------------------------------------------------------------------------
-- Target: mariadb Ver 15.1 Distrib 10.4.10-MariaDB, for Linux (x86_64) using readline 5.1
-- Usage: mariadb -uroot -p < ${path_to_sql}/init.sql
-- ------------------------------------------------------------------------------------------------
-- Change database --------------------------------------------------------------------------------
USE `ticket`;
-- ------------------------------------------------------------------------------------------------
-- User variable
-- Total user record
SET @USER_RECORD_NUM = 1000;
-- Public stored function, generate general column ------------------------------------------------
-- Generate uuid function
DELIMITER $$
CREATE FUNCTION gen_uuid() RETURNS CHAR(36)
COMMENT 'Used for generate uuid column default value'
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE uuid CHAR(36);
SET uuid = (SELECT UUID());
RETURN (uuid);
END;
$$
DELIMITER ;
-- Generate deleted column function
DELIMITER $$
CREATE FUNCTION gen_deleted() RETURNS BOOLEAN
COMMENT 'Used for generate deleted column default value'
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE deleted BOOLEAN;
SET deleted = FALSE;
RETURN (deleted);
END;
$$
DELIMITER ;
-- Generate create date column function
DELIMITER $$
CREATE FUNCTION gen_create_date() RETURNS DATETIME
COMMENT 'Used for generate create_date column default value'
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE create_date DATETIME;
SET create_date = (SELECT NOW());
RETURN (create_date);
END;
$$
DELIMITER ;
-- Generate create user column function
DELIMITER $$
CREATE FUNCTION gen_create_user() RETURNS VARCHAR(16)
COMMENT 'Used for generate create_user column default value'
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE create_user VARCHAR(16);
SET create_user = 'system';
RETURN (create_user);
END;
$$
DELIMITER ;
-- Generate update date column function
DELIMITER $$
CREATE FUNCTION gen_update_date() RETURNS DATETIME
COMMENT 'Used for generate update_date column default value'
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE update_date DATETIME;
SET update_date = (SELECT NOW());
RETURN (update_date);
END;
$$
DELIMITER ;
-- Generate update user column function
DELIMITER $$
CREATE FUNCTION gen_update_user() RETURNS VARCHAR(16)
COMMENT 'Used for generate update_user column default value'
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE update_user VARCHAR(16);
SET update_user = 'system';
RETURN (update_user);
END;
$$
DELIMITER ;
-- Generate telephone, be careful this function will return same result
DELIMITER $$
CREATE FUNCTION gen_tel_num(tel_num_length INT) RETURNS VARCHAR(11)
COMMENT 'Generate random telephone number'
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN
DECLARE length_count INT DEFAULT 2;
DECLARE tel_num VARCHAR(11) DEFAULT '1';
-- 13xx - 19xx
SET tel_num = CONCAT(tel_num, CAST(FLOOR((RAND() * 7) + 3) AS CHAR));
WHILE length_count < tel_num_length
DO
SET length_count = length_count + 1;
SET tel_num = CONCAT(tel_num, CAST(FLOOR((RAND() * 10)) AS CHAR));
END WHILE;
RETURN tel_num;
END;
$$
DELIMITER ;
-- ------------------------------------------------------------------------------------------------
-- Use stored procedure insert value --------------------------------------------------------------
-- Insert into `user_info`
DELIMITER $$
CREATE PROCEDURE init_user_info()
COMMENT 'Insert record to init user_info'
BEGIN
DECLARE v_uuid CHAR(36);
DECLARE v_user_id VARCHAR(16);
DECLARE v_nickname VARCHAR(16);
DECLARE v_gender TINYINT;
DECLARE v_deleted BOOLEAN;
DECLARE v_create_date DATETIME;
DECLARE v_create_user VARCHAR(16);
DECLARE v_update_date DATETIME;
DECLARE v_update_user VARCHAR(16);
-- Use for check record unique
DECLARE v_is_unique BIGINT;
-- Insert count
DECLARE v_insert_count BIGINT;
DECLARE v_total_insert BIGINT;
SET v_insert_count = 0;
SELECT @USER_RECORD_NUM INTO v_total_insert;
WHILE v_insert_count < v_total_insert
DO
-- Init record data
SELECT gen_uuid() INTO v_uuid;
SELECT CONCAT('tk_', SUBSTR(MD5(RAND()), 1, 13)) INTO v_user_id;
SELECT SUBSTR(MD5(RAND()), 1, 7) INTO v_nickname;
SELECT FLOOR(RAND() * 3) INTO v_gender;
SELECT gen_deleted() INTO v_deleted;
SELECT gen_create_date() INTO v_create_date;
SELECT gen_create_user() INTO v_create_user;
SELECT gen_update_date() INTO v_update_date;
SELECT gen_update_user() INTO v_update_user;
-- Check user_id unique
SELECT COUNT(*) INTO v_is_unique FROM `user_info` WHERE `user_info`.`user_id` = v_user_id;
WHILE v_is_unique > 0
DO
SELECT CONCAT('tk_', SUBSTR(MD5(RAND()), 1, 13)) INTO v_user_id;
END WHILE;
INSERT INTO `user_info`(`uuid`, `user_id`, `nickname`, `gender`, `deleted`,
`create_date`, `create_user`, `update_date`, `update_user`)
VALUES (v_uuid, v_user_id, v_nickname, v_gender, v_deleted, v_create_date,
v_create_user, v_update_date, v_update_user);
-- Output log
SELECT CONCAT('count(s) ', (v_insert_count + 1)) AS 'Inserted into user_info: ';
SET v_insert_count = v_insert_count + 1;
END WHILE;
END;
$$
DELIMITER ;
-- Insert into `user_info`(`login_token` had foreign key constraint)
DELIMITER $$
CREATE PROCEDURE init_login_token()
COMMENT 'Insert record to init user_info'
BEGIN
DECLARE v_uuid CHAR(36);
DECLARE v_intl_tel_code VARCHAR(3);
DECLARE v_tel_num VARCHAR(11);
DECLARE v_password VARCHAR(16);
DECLARE v_user_uuid CHAR(36);
DECLARE v_deleted BOOLEAN;
DECLARE v_create_date DATETIME;
DECLARE v_create_user VARCHAR(16);
DECLARE v_update_date DATETIME;
DECLARE v_update_user VARCHAR(16);
-- Use cursor to read each user_info.uuid
DECLARE v_cursor_done BOOLEAN DEFAULT FALSE;
DECLARE v_user_info_cursor CURSOR FOR SELECT `user_info`.`uuid` FROM `user_info`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_cursor_done = TRUE;
OPEN v_user_info_cursor;
user_info_loop:
LOOP
FETCH v_user_info_cursor INTO v_user_uuid;
IF v_cursor_done THEN
LEAVE user_info_loop;
END IF;
SELECT gen_uuid() INTO v_uuid;
SELECT '86' INTO v_intl_tel_code;
SELECT gen_tel_num(11) INTO v_tel_num;
SELECT SUBSTR(SHA1(RAND()), 0) INTO v_password;
SELECT gen_deleted() INTO v_deleted;
SELECT gen_create_date() INTO v_create_date;
SELECT gen_create_user() INTO v_create_user;
SELECT gen_update_date() INTO v_update_date;
SELECT gen_update_user() INTO v_update_user;
INSERT INTO `login_token`(`uuid`, `intl_tel_code`, `tel_num`, `password`, `user_uuid`, `deleted`,
`create_date`, `create_user`, `update_date`, `update_user`)
VALUES (v_uuid, v_intl_tel_code, v_tel_num, v_password, v_user_uuid, v_deleted, v_create_date,
v_create_user, v_update_date, v_update_user);
SELECT CONCAT('user_info.user_id ', v_user_uuid) AS 'Insert into login_token: ';
END LOOP;
CLOSE v_user_info_cursor;
END;
$$
DELIMITER ;
-- ------------------------------------------------------------------------------------------------
-- Call procedure to init -------------------------------------------------------------------------
CALL init_user_info();
CALL init_login_token();
-- ------------------------------------------------------------------------------------------------
以上是关于MySQL Stored Procedure To Insert Test Record的主要内容,如果未能解决你的问题,请参考以下文章
csharp: MySQL Stored Procedure using DAL
为啥当我在 mysql 中调用 STORED PROCEDURE 时 pdo->lastInsertId() 返回 0?
mysql stored routine (存储例程) 中 definer 的作用 和实例
Navicat: Can't create a procedure from within another stored routine
sql 查看Stored Procedure.sql的存储过程列表和视图定义
Home / Python MySQL Tutorial / Calling MySQL Stored Procedures in Python Calling MySQL Stored Proced