Heim  >  Artikel  >  Datenbank  >  So speichern Sie ein Array in MySQL

So speichern Sie ein Array in MySQL

(*-*)浩
(*-*)浩Original
2019-05-10 15:22:5324394Durchsuche

MySQL-Speicher-Array-Methode: Fangen Sie zunächst die eingehende Array-Zeichenfolge in mehrere Zeichen ab und übertragen Sie sie dann in eine temporäre Tabelle. Verwenden Sie schließlich einen Cursor oder verknüpfen Sie die Tabelle direkt, um den Zweck des MySQL-Speicher-Arrays zu erreichen.

So speichern Sie ein Array in MySQL

Das Problem der schwachen Funktionen von gespeicherten MySQL-Prozeduren war schon immer ein Problem für alle. Heute werde ich über die Lösung des Problems sprechen, das gespeicherte MySQL-Prozeduren nicht können Übergeben Sie Array-Typ-Parameter.

Empfohlener Kurs: MySQL-Tutorial.

In vielen Fällen werden beim Schreiben gespeicherter Prozeduren häufig Arrays verwendet, es gibt jedoch keine Möglichkeit, die Parameter der gespeicherten Prozedur in MySQL direkt an das Array zu übergeben. In diesem Fall können wir die Parameter nur zurückziehen oder auf andere Weise in Zeichenfolgenform übergeben und dann die Zeichenfolge im Prozedurkörper in ein Array konvertieren.

Aber es tut mir leid, Ihnen mitteilen zu müssen, dass MySQL keine direkte Funktion zum Konvertieren eines Strings in ein Array bereitstellt. Hast du jetzt Lust, jemanden zu schlagen? Aber keine Panik, dieser Weg ist blockiert, nehmen wir einen anderen Weg, es gibt immer eine Lösung. Wir können die eingehende Zeichenfolge in mehrere Zeichen aufteilen und an die temporäre Tabelle übergeben und dann einen Cursor oder direkt verwandte Tabellen verwenden, um die Daten zu filtern. Auf diese Weise kann später der gewünschte Effekt erzielt werden.

Üben wir es anhand eines Beispiels:

1. Erstellen Sie eine Datenbank, zum Beispiel:

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. Anforderungen: Schülerinformationen stapelweise basierend auf den Schülerzahlen löschen

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 ;

Erklärung: Beim Erstellen der gespeicherten Prozedur werden zwei Parameter übergeben. Der erste stellt die zu übergebende Array-String-Form dar und der zweite Parameter gibt an, wie die Zeichenfolge aufgeteilt wird.

Deklarieren Sie Initialisierungsvariablen

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

Ermitteln Sie die Länge des eingehenden Parameterarrays

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

Erstellen Sie eine temporäre Tabelle

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

Fangen Sie die Array-Zeichenfolge ab und speichern Sie sie in die temporäre Tabelle der Reihe nach Für spätere geschäftliche Verwendung

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;

Hinweis: Stellen Sie sicher, dass Sie die temporäre Tabelle löschen, wenn die gespeicherte Prozedur endet

Wenn das Geschäft nicht sehr komplex ist, besteht keine Notwendigkeit, es zu verwenden Die gespeicherte Prozedur soll nicht jedem helfen, sie zu verwenden. Gespeicherte Prozeduren sollen nur jeden wissen lassen, dass es so etwas gibt!

Das obige ist der detaillierte Inhalt vonSo speichern Sie ein Array in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn