Problembeschreibung: Der Benutzer hat die Anforderung, dass von Zeit zu Zeit ein Feld mit dem Wort „Verstoß“ in einer Tabelle erscheint, und der Benutzer muss die gesamte Datenzeile löschen, wenn dieses Feld erscheint. Dies ist eine Sammelaufgabe. Wenn Daten gefunden werden, die das Wort „Verstoß“ enthalten, werden sie einheitlich zu jeder Stunde oder zu einer bestimmten Zeit gemeldet. Es gibt keine Möglichkeit, die Quelle zu kontrollieren, um die Generierung solcher Daten zu verhindern. Nun müssen wir folgende Voraussetzungen erfüllen:1. Erkennen Sie die Generierung dieser Daten in Echtzeit und löschen Sie sie nach der Entdeckung 2. Sichern Sie diese Daten, bevor Sie sie löschen Lösung:Es bedarf einer klaren Lösung. 1. Zunächst einmal: Wie kann eine Löschung in Echtzeit erkannt werden? Fragen Sie den Entwickler, ob die Daten durch Einfügen generiert werden. Dann können Sie einen Trigger erstellen, um die Daten beim Einfügen in die Tabelle zu löschen. 2. Wie führe ich eine Sicherung durch? Welche Methode zum Sichern? Kann die Sicherung in einer Tabelle durchgeführt werden, die den Zeitpunkt jeder Einfügung aufzeichnet? Die Sicherungstabelle kann grundsätzlich dieselbe Struktur wie die ursprüngliche Tabelle haben, aber die Autoinkrementattribute, der Primärschlüssel, der Fremdschlüssel und andere Attribute der ursprünglichen Tabelle müssen aus der Sicherungstabelle gelöscht und ein Zeitstempelfeld hinzugefügt werden, um die Aufzeichnung des Zeitpunkts jeder Sicherungsdatei zu erleichtern. Die oben genannten Attribute werden gelöscht, um Daten in die Sicherungstabelle schreiben zu können. 3. Wie erstelle ich vor dem Löschen ein Backup? Ich dachte zunächst, ich könnte es einfach in einen Trigger einfügen, zuerst die Daten sichern und sie anschließend löschen, aber beim Testen funktionierte das nicht. Testplan:Bereiten Sie zunächst einige Testdaten und Testtabellen vor 1. Testdaten erstellen mysql> zeigen, Tabelle erstellen, Student; +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Tabelle | Tabelle erstellen | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Student | CREATE TABLE `Student` ( `Sno` char(9) NICHT NULL, `Sname` char(20) NICHT NULL, `Ssex` char(2) DEFAULT NULL, `Sage` smallint DEFAULT NULL, `Sdept` char(20) DEFAULT NULL, PRIMÄRSCHLÜSSEL (`Sno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 Zeile im Satz (0,01 Sek.) 2. Erstellen Sie eine Sicherungstabelle. Überprüfen Sie die Anweisung zur Tabellenerstellung. Die formale Umgebung kennt die Tabellenstruktur der Originaltabelle nicht. Es ist erforderlich, die ursprüngliche Tabellenstruktur zu ändern und eine neue Sicherungstabelle zu erstellen. Ursprüngliche Anweisung zur Tabellenerstellung mysql> zeigen, Tabelle erstellen, Student; +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Tabelle | Tabelle erstellen | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Student | CREATE TABLE `Student` ( `Sno` char(9) NICHT NULL, `Sname` char(20) NICHT NULL, `Ssex` char(2) DEFAULT NULL, `Sage` smallint DEFAULT NULL, `Sdept` char(20) DEFAULT NULL, PRIMÄRSCHLÜSSEL (`Sno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 Zeile im Satz (0,01 Sek.) 3. Backup-Anweisungen vorbereiten, Anweisungen löschen und Testanweisungen einfügen Backup-Anweisung (da die Backup-Tabelle ein zusätzliches Zeitstempelfeld hat, muss die Backup-Anweisung geändert werden) mysql> anzeigen, Tabelle student_bak erstellen; +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Tabelle | Tabelle erstellen | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | student_bak | CREATE TABLE `student_bak` ( `Sno` char(9) NICHT NULL, `Sname` char(20) NICHT NULL, `Ssex` char(2) DEFAULT NULL, `Sage` smallint DEFAULT NULL, `Sdept` char(20) DEFAULT NULL, `create_date` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci | +-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 Zeile im Satz (0,00 Sek.) Backup-Effekt Testanweisung einfügen: in Studentenwerte einfügen ('201215124', 'Zweit', 'Zweit', 20, 'EL'); Löschanweisung (achten Sie darauf, die Löschanweisung genau zu formulieren und zu belegen, was Sie löschen möchten) Löschen aus Student, wobei Sdept = "EL" ist; 4. Tatsächlicher Testplan 4.1 Zwei Anweisungen in einen Trigger schreiben (Operation fehlgeschlagen, Logikausführung fehlgeschlagen) Trigger löschen, falls vorhanden, Testtrigger; TRENNUNGSZEICHEN $ TRIGGER ERSTELLEN test_trigger NACH INSERT ON student2 FÜR JEDE REIHE BEGINNEN einfügen in student_bak(Sno, Sname, Ssex, Sage, Sdept) auswählen * von Student, wobei Sdept='EL'; Löschen aus Student, wobei Sdept = "EL" ist; ENDE $ TRENNUNGSZEICHEN ; 4.2 Bereiten Sie zwei separate Auslöser vor. Einer besteht darin, die Daten in die Sicherungstabelle einzufügen, um den Sicherungseffekt zu erzielen, wenn die Daten in der Originaltabelle erscheinen. Der zweite Trigger besteht darin, einen Trigger zum Löschen der Daten in der Originaltabelle zu erstellen, nachdem die Daten in der Sicherungstabelle gesichert wurden. Anschließend wird der Löscheffekt nach der Sicherung erzielt (der Vorgang schlägt immer noch fehl) und die Ausführung meldet einen Fehler, der besagt, dass ein Triggerkonflikt oder etwas Ähnliches vorliegt. Dadurch wird die Datenbank über die Ausführungslogik nicht informiert. 4.3 Erstellen Sie einen Trigger, der die Zieldaten in der Originaltabelle löscht und die Daten dann in der Sicherungstabelle sichert. Schließlich müssen wir nur noch die Zieldaten in Echtzeit erkennen und löschen. Wir sind nicht auf das Trigger-Denken beschränkt. Wir können einfach eine geplante Aufgabe ausführen (der Vorgang ist erfolgreich). Wenn im folgenden Test beispielsweise ein Feld mit dem Namen „EL“ im Feld „Sdept“ in der Datenbanktabelle erscheint, muss die gesamte Datenzeile gelöscht werden. Trigger löschen, falls student_bak_trigger vorhanden ist; TRENNUNGSZEICHEN $ TRIGGER ERSTELLEN student_bak_trigger VOR LÖSCHEN BEIM Schüler FÜR JEDE REIHE BEGINNEN einfügen in student_bak(Sno,Sname,Ssex,Sage,Sdept) auswählen * von Student, wobei Sdept='EL'; ENDE $ TRENNUNGSZEICHEN ; Dieser Trigger wird implementiert. Wenn die Zieldaten in der Originaltabelle gelöscht werden, wird der Trigger ausgelöst, um die Daten zu sichern. mysql> wähle * vom Studenten aus; +-----------+--------+------+------+---------+----------+ | Sno | Sname | Ssex | Sage | Sdept | +-----------+--------+------+------+---------+----------+ | 201215121 | Li Yong | Männlich | 20 | CS | | 201215122 | Liu Chen | Weiblich | 19 | CS | | 201215123 | Wang Min | Weiblich | 18 | MA | | 201215130 | Soldat | Männlich | 20 | CH | +-----------+--------+------+------+---------+----------+ 4 Zeilen im Satz (0,00 Sek.) mysql> wähle * aus student_bak; +-----------+--------+------+----------+---------------------+ | Sno | Sname | Ssex | Sage | Sdept | Erstelldatum | +-----------+--------+------+----------+---------------------+ | 201215124 | Zhang San | Männlich | 20 | EL | 18.09.2021 15:42:20 | +-----------+--------+------+----------+---------------------+ 1 Zeile im Satz (0,00 Sek.) mysql> in Studentenwerte einfügen('201215125','Nein','Nein',30,'EL'); Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> wähle * vom Studenten aus; +-----------+--------+------+------+---------+----------+ | Sno | Sname | Ssex | Sage | Sdept | +-----------+--------+------+------+---------+----------+ | 201215121 | Li Yong | Männlich | 20 | CS | | 201215122 | Liu Chen | Weiblich | 19 | CS | | 201215123 | Wang Min | Weiblich | 18 | MA | | 201215125 | Wang Wu | Männlich | 30 | EL | | 201215130 | Soldat | Männlich | 20 | CH | +-----------+--------+------+------+---------+----------+ 5 Zeilen im Satz (0,00 Sek.) mysql> wähle * aus student_bak; +-----------+--------+------+----------+---------------------+ | Sno | Sname | Ssex | Sage | Sdept | Erstelldatum | +-----------+--------+------+----------+---------------------+ | 201215124 | Zhang San | Männlich | 20 | EL | 18.09.2021 15:42:20 | +-----------+--------+------+----------+---------------------+ 1 Zeile im Satz (0,00 Sek.) mysql> löschen von Student, wobei Sdept = "EL" ist; Abfrage OK, 1 Zeile betroffen (0,01 Sek.) mysql> wähle * aus student_bak; +-----------+--------+------+----------+---------------------+ | Sno | Sname | Ssex | Sage | Sdept | Erstelldatum | +-----------+--------+------+----------+---------------------+ | 201215124 | Zhang San | Männlich | 20 | EL | 18.09.2021 15:42:20 | | 201215125 | Wang Wu | Männlich | 30 | EL | 18.09.2021 15:47:28 | +-----------+--------+------+----------+---------------------+ 2 Zeilen im Satz (0,00 Sek.) Implementieren Sie abschließend eine geplante Aufgabe, um die gesamte Datenzeile in einem Feld namens „EL“ zyklisch zu löschen. Die geplante Aufgabe ist hier global und der Datenbankname und der spezifische Tabellenname müssen hinzugefügt werden. Die Ausführungsgeschwindigkeit der geplanten Aufgabe kann manuell angepasst werden. Im Folgenden wird 3 s/Zeit angegeben, um den gewünschten Effekt zu erzielen. Ereignis erstellen, falls nicht vorhanden e_test_event planmäßig alle 3 Sekunden nach Fertigstellung bewahren Löschen Sie aus abc.student, wo Sdept='EL'; Geplante Aufgaben deaktivieren: mysql> Ereignis „e_test_event“ bei Abschluss ändern, deaktivieren und bewahren; Abfrage OK, 0 Zeilen betroffen (0,00 Sek.) Geplante Aufgaben anzeigen: mysql> select * from information_schema.events\G;**************************** 4. Zeile *************************** EVENT_CATALOG: def EVENT_SCHEMA: abc EVENT_NAME: e_test_event DEFINIERER: root@% ZEITZONE: SYSTEM EVENT_BODY: SQL EVENT_DEFINITION: Löschen aus abc.student, wobei Sdept='EL' EVENT_TYPE: WIEDERKEHREND EXECUTE_AT: NULL INTERVAL_VALUE: 3 INTERVAL_FIELD: SEKUNDE SQL_MODE: NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEINE_ENGINE_SUBSTITUTION BEGINNT: 2021-09-17 13:35:44 ENDE: NULL STATUS: AKTIVIERT ON_COMPLETION: BEWAHREN ERSTELLT: 2021-09-17 13:35:44 LAST_ALTERED: 2021-09-17 13:35:44 LETZTE AUSFÜHRUNG: 2021-09-18 15:43:35 EVENT_COMMENT: Urheber: 3330614 CHARACTER_SET_CLIENT: utf8mb4 COLLATION_CONNECTION: utf8mb4_0900_ai_ci DATABASE_COLLATION: utf8mb4_0900_ai_ci 4 Zeilen im Satz (0,00 Sek.) Auslöser anzeigen: mysql> wähle * aus information_schema.triggers\G; *************************** 5. Reihe *************************** TRIGGER_CATALOG: def TRIGGER_SCHEMA: abc TRIGGER_NAME: student_bak_trigger EVENT_MANIPULATION: LÖSCHEN EVENT_OBJECT_CATALOG: def EVENT_OBJECT_SCHEMA: abc EVENT_OBJECT_TABLE: Student AKTION_ORDER: 1 ACTION_CONDITION: NULL ACTION_STATEMENT: BEGIN einfügen in student_bak(Sno,Sname,Ssex,Sage,Sdept) auswählen * von Student, wobei Sdept='EL'; ENDE ACTION_ORIENTATION: REIHE ACTION_TIMING: VORHER ACTION_REFERENCE_OLD_TABLE: NULL ACTION_REFERENCE_NEW_TABLE: NULL ACTION_REFERENCE_OLD_ROW: ALT ACTION_REFERENCE_NEW_ROW: NEU ERSTELLT: 2021-09-18 15:41:48.53 SQL_MODE: NUR_VOLLSTÄNDIGE_GRUPPE_NUR, STRENGE_TRANS_TABELLEN, KEINE_NULL_IM_DATUM, KEIN_NULL_DATUM, FEHLER_FÜR_DIVISION_DURCH_NULL, KEINE_ENGINE_SUBSTITUTION DEFINIERER: root@% CHARACTER_SET_CLIENT: utf8mb4 COLLATION_CONNECTION: utf8mb4_0900_ai_ci DATABASE_COLLATION: utf8mb4_0900_ai_ci 5 Zeilen im Satz (0,00 Sek.) Ergebnis: Dies ist das Ende dieses Artikels mit der detaillierten Erklärung der Idee der Echtzeiterkennung einer Anweisung zum Sichern und Löschen durch MySQL-Trigger. Weitere relevante Inhalte zum Sichern und Löschen durch MySQL-Trigger finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Detaillierte Erläuterung von vier Lösungen für schwebende Probleme im CSS-Layout
>>: Detaillierte Erläuterung der Javascript-Ereigniserfassungs- und Bubbling-Methoden
Docker bietet mehrere Netzwerke wie Bridge, Host,...
Installations-Tutorial für VMware12.0+Ubuntu16.04...
Befehle zur Linux-Onlineinstallation: yum install...
Inhaltsverzeichnis 1. Zugehörige Konfiguration Fa...
Der Code sieht folgendermaßen aus: // Linienstil ...
Vorwort Ich habe kürzlich mein Front-End-Wissen z...
CocosCreator-Version: 2.3.4 Die meisten Spiele ve...
Statische Dateien Nginx ist für seine hohe Leistu...
Inhaltsverzeichnis 1. Warum NanoID UUID ersetzt 2...
1. Befehlseinführung Mit „time“ werden die für di...
Das Erstellen von Webseiten, die Webstandards ents...
Gefühle: Ich bin Backend-Entwickler. Manchmal fühl...
Inhaltsverzeichnis 1. Was ist Javascript? 2. Was ...
Dieser Artikel beschreibt die Installations- und ...
In diesem Artikelbeispiel wird der spezifische Ja...