MySQL implementiert eine Funktion ähnlich der MySQL-Methode oder gespeicherten Prozedur connect_by_isleaf

MySQL implementiert eine Funktion ähnlich der MySQL-Methode oder gespeicherten Prozedur connect_by_isleaf

In letzter Zeit gibt es eine besonders ungewöhnliche Geschäftsnachfrage, es gibt einen Tisch

CREATE TABLE `demo` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `tid` int(11) STANDARD '0',
 `pid` int(11) STANDARD '1',
 PRIMÄRSCHLÜSSEL (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3000124 DEFAULT CHARSET=utf8;

Das ist alles. Es gibt mehr als 3 Millionen Zeilen mit Datensätzen. Jede PID zeichnet die Kategorie der obersten Ebene dieser ID auf, und die TID ist ihre übergeordnete Kategorie!
Jetzt lautet die Anforderung: Finden Sie durch Angabe einer ID alle ihre Teilmengenmitglieder heraus und ändern Sie den Wert dieser PID auf den neu angegebenen Wert! !
Ich habe es in PHP ausgeführt und die Ausführung hat über 50 Sekunden gedauert, was echt nervig war! ! !
Es ist notwendig, alle Teilmengen rekursiv zu finden und ihre PIDs zu ändern, was viel Arbeit bedeutet.

Es gibt in Oracle eine Methode namens connect_by_isleaf, mit der alle Teilmengen problemlos gefunden werden können, aber ich verwende MySQL ...

Daher werde ich hier einfach über meine Erfahrungen mit der Verwendung von MySQL-Methoden oder gespeicherten Prozeduren zur Implementierung schreiben

Erstens: MySQL-Methode

CREATE DEFINER=`root`@`localhost` FUNCTION `lvtao_demo_a`(rootId int) GIBT Text CHARSET utf8 ZURÜCK
  Liest SQL-Daten
  KOMMENTAR 'Demo'
BEGINNEN

DECLARE sTemp-Text;
DECLARE sTempChd-Text;

SET sTempChd =cast(rootId als CHAR);
SETZEN Sie sTemp = '';

WHILE sTempChd ist nicht null DO
  SET sTemp = concat(sTemp,',',sTempChd);
  Wählen Sie group_concat(id) INTO sTempChd FROM demo, wobei FIND_IN_SET(tid, sTempChd)>0;
ENDE WÄHREND;

RÜCKGABE sTemp;

ENDE;

Die Verwendungsmethode ist

wähle lvtao_demo_a(5);

Aber als ich es getestet habe, sind die 3 Millionen Daten praktisch abgestürzt! ! !

Daten zu lang für Spalte „sTemp“ in Zeile 1

Vorteile: einfach, bequem, keine Begrenzung der Tiefe der rekursiven Aufrufebenen (max_sp_recursion_depth, maximal 255);
Nachteile: Begrenzte Länge.

Der zweite Typ: gespeicherte Prozedur + Zwischentabelle

TRENNUNGSZEICHEN ;;
CREATE DEFINER=`root`@`localhost` VERFAHREN `sss`(IN pid int, IN rootid int)
BEGINNEN
   
DECLARE fertig INT DEFAULT FALSE;
ID-TEXT DEKLARIEREN;
DECLARE cur1 CURSOR FÜR SELECT id FROM demo WHERE tid=pid;
DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDEN SET done = TRUE;

setze max_sp_recursion_depth = 200;
 
ÖFFNEN cur1;
  read_loop: SCHLEIFE
    Hole cur1 in ID;
    WENN erledigt, DANN
      LEAVE read_loop;
    ENDE, WENN;
    INSERT INTO temp(rootid,zid) Werte(rootid,id);
    rufe sss(id,rootid) auf;
  ENDE DER SCHLEIFE;
SCHLIESSEN cur1;

ENDE;;
TRENNUNGSZEICHEN ;

Haha, 3 Millionen Daten stecken auch in einem Ball~~~

Lass uns einen anderen Weg finden~~~~ Ich werde mich damit nicht mehr beschäftigen

Das könnte Sie auch interessieren:
  • So generieren Sie Datensätze stapelweise mithilfe gespeicherter Prozeduren in MySQL unter Linux
  • Einfache Implementierung von Mybatis, das eine gespeicherte MySQL-Prozedur aufruft
  • Vergleich der Unterschiede zwischen MySQL und Oracle: Fünf: Gespeicherte Prozeduren und Funktionen
  • Die gespeicherte MySQL-Prozedur ermittelt doppelte Daten und fügt sie nicht ein
  • Detaillierte Erklärung zum Aufrufen gespeicherter MySQL-Prozeduren in Java
  • Implementierung der Baumdurchquerung durch gespeicherte Prozeduren in der MySQL-Datenbank
  • Beispiel für die Optimierung gespeicherter MySQL-Prozeduren
  • Beispielanalyse gespeicherter Prozeduren in MySQL und wie gespeicherte Prozeduren aufgerufen werden
  • Detaillierte Erläuterung der gespeicherten Prozeduren, Cursor und Transaktionsbeispiele von MySQL

<<:  Zusammenfassung der Verwendung von berechneten Vue-Eigenschaften und -Listenern

>>:  So stellen Sie ElasticSearch in Docker bereit

Artikel empfehlen

Beispiel zum Entfernen eines JSON-Backslashs in PHP

1. Entfernen Sie Backslashes mit der Methode „str...

HTML verwendet Laufschrift, um Text nach links und rechts scrollen zu lassen

Code kopieren Der Code lautet wie folgt: <KÖRP...

Tutorial zu HTML-Tabellen-Tags (20): Zeilenhintergrund-Farbattribut BGCOLOR

Mit dem BGCOLOR-Attribut kann die Hintergrundfarb...

Detaillierte Erklärung der Docker-Einstiegspunktdatei

Schließen Sie beim Schreiben einer Docker-Datei e...

So verwenden Sie rsync unter Linux

Inhaltsverzeichnis 1. Einleitung 2. Installation ...

Lösen Sie das Problem der Installation von Theano auf Ubuntu 19

Lösung: Ändern Sie die Datei setup.py direkt in d...

TypeScript-Union-Typen, Schnittmengentypen und Typwächter

Inhaltsverzeichnis 1. Union-Typ 2. Crossover-Typ ...

Implementierungscode für die HTML-Drag & Drop-Funktion

Basierend auf Vue Die Kernidee dieser Funktion be...

Uniapp implementiert Beispielcode für die Anmeldung mit DingTalk-Scancode

Da Uniapp nicht über eine autorisierte DingTalk-A...

Verschönerung der Dualsystem-Boot-Schnittstelle für Win10 + Ubuntu20.04 LTS

Effektanzeige Die eingebaute Boot-Oberfläche ist ...