MySQL Select in Variable

Es gibt verschiedene Möglichkeiten einen Wert aus einem Select in eine Variable zu speichern.
Dennoch gibt es unterschiedliche Ergebnisse.

SELECT INTO

SELECT ID INTO @MeineID FROM Table WHERE Short = "MeinName";

Ein großer Nachteil von SELECT INTO ist, die Variable wird nur gesetzt, wenn das SELECT einen return Wert hat.
Wurde die Variable bereits vorab gesetzt und in meiner SELECT INTO Query es gab keinen Return Wert, dann bleibt die Variable auf dem alten Wert. Das kann schwerwiegende Folgen für weitere Operationen haben.

Deshalb empfinde ich es besser SET zu verwenden.

SET @MeineID = (SELECT ID FROM Table WHERE Name = "MeinName");

Hier wird die Variable immer gesetzt, ist meine Query erfolglos, ist der Wert null. Egal welchen Wert sie vorher hatte.

MySQL Procedure debuggen

Wie kann ich eine Procedure debuggen?

Ich persönlich nutze dazu gern eine eigene Procedure die eine Tabelle beschreibt.

DELIMITER $$

DROP PROCEDURE IF EXISTS DEBUG_PROCEDURE;
CREATE PROCEDURE DEBUG_PROCEDURE (Identifier VARCHAR(255), Name VARCHAR(255), Value VARCHAR(255))
BEGIN

CREATE TABLE IF NOT EXISTS `TMP_DEBUG` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`identifier` VARCHAR(50) NULL DEFAULT NULL,
	`name` VARCHAR(50) NULL DEFAULT NULL,
	`value` VARCHAR(50) NULL DEFAULT NULL,
	`time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;

INSERT INTO TMP_DEBUG (`identifier`, `name`, `value`) VALUES
(Identifier,  Name, Value);

END$$
DELIMITER ;

Nun kann ich in jeder Procedure mit CALL einen Debug Eintrag erzeugen.

CALL DEBUG_PROCEDURE("ProcedureName", "Name der Var", "Value");

MySQL Procedure

Wie kann ich eine Prozedur in MySQL anlegen?

Eine Procedure kann dazu verwendet werden mehrere SQL Befehle anzustoßen.

Um eine Procedure anzulegen, kann ich diverse SQL Tools nutzen, oder sebst ein SQL zum Erstellen anlegen.
Wenn ich mich für das eigene sql entscheide muss ich für das CREATE Kommando einen eigenen Delimiter verwenden.
Warum? Der Delimiter dient dazu das Ende des Befehles für den SQL Server zu markieren. Da eine Procedure mehrere Kommandos enthält, welche mit dem Semikolon abgeschlossen werden, würde der Server es nach dem ersten Semikolon einen SQL Befehl erkennen und ausführen. Das wiederum würde einen Fehler erzeugen.
Um dies zu umgehen setze ich vor der Erstellung der Procedure meinen Delimiter auf zB $$ und am Ende wieder auf ;.

-- ich setze meinen Delimiter auf $$
DELIMITER $$

-- eventuell gibt es eine alte Version meiner Prozedure, daher lösche ich diese
DROP PROCEDURE IF EXISTS MY_FIRST_PROCEDURE;
-- nun erzeuge ich meine Procedure
CREATE PROCEDURE MY_FIRST_PROCEDURE (VariableA VARCHAR(255), VariableB VARCHAR(255))
BEGIN
    -- hier kann nun ganz normaler sql ausgeführt werden
    -- SELECT, UPDATE, DELETE, Aufruf von Funtionen und Prozeduren
    
    -- innerhalb er Prozedure verwende ich den Standard Delimiter
    SELECT CONCAT('Hallo ', VariableA, ' ', VariableB);

-- am Ende den gesetzten Delimiter
END$$

-- nun setze ich den Delimiter auf Standard zurück
DELIMITER ;

Ausführen kann ich diese Prozedure wie folgt:

CALL MY_FIRST_PROCEDURE("Vorname", "Nachname");

MySQL Befehle

Exportieren
Einzelne MySQL Datenbank exportieren

mysqldump -u username -p database_name > dump.sql

Die Struktur einer MySQL Datenbank exportieren

mysqldump -u username -p --no-data database_name > dump.sql

Die Daten aus einer MySQL Datenbank exportieren

mysqldump -u username -p --no-create-info database_name > dump.sql

Mehrere MySQL Datenbanken exportieren

mysqldump -u username -p --databases db_name1 [db_name2 ...] > dump.sql

Alle Mysql Datenbanken in eine Datei exportieren

mysqldump -u username -p --all-databases --skip-lock-tables > alldatabases.sql

Importieren

MySQL Datenbank importieren

mysql -u username -p -D MeineDB < database.sql

Eine Datenbank aus der Datei "alldatabases.sql" importieren

mysql -u username -p --one-database destdbname < alldatabases.sql

Sonstiges
Fehler übergehen -f force

mysql -f ...

Einen Teil eines Strings suchen und ersetzen:

UPDATE MeineTabelle SET MeinFeld = REPLACE(MeinFeld, 'suchstring', 'replacestring')