>  기사  >  데이터 베이스  >  mysql에서 배열을 저장하는 방법

mysql에서 배열을 저장하는 방법

(*-*)浩
(*-*)浩원래의
2019-05-10 15:22:5324461검색

Mysql 배열 저장 방법: 먼저 들어오는 배열 문자열을 여러 문자로 가로채서 임시 테이블에 전달합니다. 마지막으로 커서를 사용하거나 테이블을 직접 연결하여 데이터를 필터링하여 mysql을 달성합니다. 배열을 저장하는 것입니다.

mysql에서 배열을 저장하는 방법

mysql 저장 프로시저의 약한 기능 문제 오늘은 항상 우려되는 문제에 대한 해결책에 대해 이야기하겠습니다. MySQL 저장 프로시저는 배열 유형 계획을 전달할 수 없습니다.

추천 강좌: MySQL 튜토리얼.

저장 프로시저를 작성할 때 배열을 사용하는 경우가 많지만, mysql에서는 저장 프로시저의 매개변수를 직접 전달하는 방법이 없습니다. 이 경우 다른 방법으로 문자열 형식의 매개변수를 후퇴하거나 전달한 다음 프로시저 본문에서 문자열을 배열로 변환할 수만 있습니까?

하지만 mysql에서는 문자열을 배열로 변환하는 기능을 직접적으로 제공하지 않는다는 점을 말씀드리게 되어 죄송합니다. 이제 누군가를 때리고 싶은 기분이 드나요? 하지만 당황하지 마십시오. 이 길이 막혔습니다. 다른 길로 갑시다. 해결책은 항상 있습니다. 들어오는 문자열을 여러 문자로 가로채서 임시 테이블에 전달한 다음 커서나 직접 관련된 테이블을 사용하여 데이터를 필터링할 수 있습니다. 이런 방식으로 나중에 원하는 효과를 얻을 수 있습니다.

예를 들어 연습해 봅시다:

1. 예를 위한 데이터베이스 만들기:

CREATE DATABASE huafeng_db;

use huafeng_db;

DROP TABLE IF EXISTS `huafeng_db`.`t_scores`;
DROP TABLE IF EXISTS `huafeng_db`.`t_students`;
DROP TABLE IF EXISTS `huafeng_db`.`t_class`;

CREATE TABLE `huafeng_db`.`t_class` (  `class_id` int(11) NOT NULL,  `class_name` varchar(32) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('1', '一年级');
INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('2', '二年级');
INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('3', '三年级');
INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('4', '四年级');
INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('5', '五年级');
INSERT INTO `huafeng_db`.`t_class` (`class_id`, `class_name`) VALUES ('6', '六年级');

CREATE TABLE `t_students` (  `student_id` int(11) NOT NULL AUTO_INCREMENT,  `student_name` varchar(32) NOT NULL,  `sex` int(1) DEFAULT NULL,  `seq_no` int(11) DEFAULT NULL,  `class_id` int(11) NOT NULL,
  PRIMARY KEY (`student_id`),
  KEY `class_id` (`class_id`),
  CONSTRAINT `t_students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `t_class` (`class_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小红',0,1,'1');
INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小青',0,2,'2');
INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小明',1,3,'3');
INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小兰',0,4,'4');
INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小米',1,5,'5');
INSERT INTO `huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) VALUES('小白',1,6,'6');

CREATE TABLE `huafeng_db`.`t_scores` (  `score_id` int(11) NOT NULL AUTO_INCREMENT,  `course_name` varchar(64) DEFAULT NULL,  `score` double(3,2) DEFAULT NULL,  `student_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`score_id`),
  KEY `student_id` (`student_id`),
  CONSTRAINT `t_scores_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `t_students` (`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('1', '语文', '90', '1');
INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('2', '数学', '97', '1');
INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('3', '英语', '95', '1');
INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('4', '语文', '92', '2');
INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('5', '数学', '100', '2');
INSERT INTO `t_scores` (`score_id`, `course_name`, `score`, `student_id`) VALUES ('6', '英语', '98', '2');

2. 요구 사항: 학생 수에 따라 일괄 삭제 학생 정보

DROP PROCEDURE IF EXISTS `p_del_studentInfo_bySeqNo`;
DELIMITER $$
CREATE PROCEDURE p_del_studentInfo_bySeqNo(IN arrayStr VARCHAR(1000),IN sSplit VARCHAR(10))
SQL SECURITY INVOKER  #允许其他用户运行BEGIN    DECLARE e_code INT DEFAULT 0;#初始化报错码为0
    DECLARE result VARCHAR(256) CHARACTER set utf8;#初始化返回结果,解决中文乱码问题

    DECLARE arrLength INT DEFAULT 0;/*定义数组长度*/
    DECLARE arrString VARCHAR(1000);/*定义初始数组字符*/
    DECLARE sStr VARCHAR(1000);/*定义初始字符*/
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e_code=1;#遇到错误后继续执行;(需要返回执行结果时用这个)


    START TRANSACTION;#启动事务
    SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*获得数组长度*/
    SET arrString = arrayStr;
    DROP TEMPORARY TABLE IF EXISTS list_tmp;
    create temporary table list_tmp(id VARCHAR(32));/*定义临时表*/

    WHILE arrLength > 0 DO
      set sStr = substr(arrString,1,instr(arrString,sSplit)-1);            -- 得到分隔符前面的字符串  
      set arrString = substr(arrString,length(sStr)+length(sSplit)+1);     -- 得到分隔符后面的字符串  
      set arrLength = arrLength -1;
      set @str = trim(sStr);
      insert into list_tmp(id) values(@str);
     END WHILE;     IF row_count()=0 THEN  
        SET e_code = 1;  
        SET result = '请输入正确的参数';  
      END IF;

    set @count = (SELECT count(1) FROM t_students s,list_tmp t WHERE s.seq_no = t.id);    IF @count >0 THEN
        DELETE FROM t_scores WHERE student_id in (SELECT s.student_id FROM t_students s,list_tmp t WHERE s.seq_no = t.id);
        DELETE FROM t_students WHERE student_id in (SELECT t.id FROM list_tmp t);    ELSE
         SET e_code = 1;
         SET result = '该学生不存在!';
    END IF;    IF e_code=1 THEN
        ROLLBACK;  #回滚
    ELSE
        COMMIT;
        SET result = '该学生已被删除成功';
    END IF;
    SELECT result;
    DROP TEMPORARY TABLE IF EXISTS list_tmp;
END $$
DELIMITER ;

설명: 저장 프로시저를 생성할 때 두 개의 매개변수가 전달됩니다. 첫 번째 매개변수는 전달될 배열 문자열 형식을 나타내며, 두 번째 매개변수는 문자열을 분할하는 것입니다.

초기화 변수 선언

DECLARE arrLength INT DEFAULT 0;/*定义数组长度*/
DECLARE arrString VARCHAR(1000);/*定义初始数组字符*/
DECLARE sStr VARCHAR(1000);/*定义初始字符*/

수신 매개변수 배열의 길이 가져오기

SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*获得数组长度*/
SET arrString = arrayStr;/*赋值*/

임시 테이블 만들기

DROP TEMPORARY TABLE IF EXISTS list_tmp;
create temporary table list_tmp(id VARCHAR(32));/*定义临时表*/

배열 문자 가로채기 직렬화 및 병렬화는 후속 비즈니스 사용을 위해 임시 테이블에 순차적으로 저장됩니다

WHILE arrLength > 0 DO
  set sStr = substr(arrString,1,instr(arrString,sSplit)-1);            -- 得到分隔符前面的字符串  
  set arrString = substr(arrString,length(sStr)+length(sSplit)+1);     -- 得到分隔符后面的字符串  
  set arrLength = arrLength -1;
  set @str = trim(sStr);
  insert into list_tmp(id) values(@str);
END WHILE;

참고: 저장 프로세스가 끝나면 임시 테이블을 삭제하는 것을 잊지 마세요

# 🎜🎜#매우 복잡한 비즈니스에는 필요하지 않습니다. 저장 프로시저에 대해 이 글은 저장 프로시저 사용 방법을 안내하는 것이 아니라, 그런 것이 있다는 것을 모두에게 알리기 위한 것입니다!

위 내용은 mysql에서 배열을 저장하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.