mysql

MariaDB Create Database

Written by  on Oktober 23, 2019

Eine Datenbank anlegen geht ganz einfach

MariaDB [(none)]> create database db1;
Query OK, 1 row affected (0.001 sec)

Außer es soll ein Bindestrich im Datenbanknamen vorkommen

MariaDB [(none)]> create database db-1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-1' at line 1

Vielleicht helfen Anführungszeichen

MariaDB [(none)]> create database "db-1";
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"db-1"' at line 1

Oder einfache Hochkommata

MariaDB [(none)]> create database 'db-1';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''db-1' at line 1

Oder mit einem Schrägstrich quotieren

MariaDB [(none)]> create database 'db\-1';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''db\-'' at line 1

Oder so was

MariaDB [(none)]> create database ´db-1´;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-1´' t line 1

Nein, es müssen Backticks sein

MariaDB [(none)]> create database `db-1`;
Query OK, 1 row affected (0.001 sec)

Ist doch logisch!?

SQL NULL-SAFE

Written by  on August 6, 2019

Liefert keine Felder zurück, wo eines oder beide Felder NULL sind:

select usr_id from usr_data where (usr_data.a != usr_data.b);

NULL-SAFE – schlägt auch an, wenn eines der Felder NULL ist:

select usr_id from usr_data where NOT (usr_data.a <=> usr_data.b);

MariaDB Doku

SQL Query in Crontab

Written by  on April 16, 2017

Soll ein Cronjob eine SQL Query ausführen, läuft man schnell in ein Problem. Das Prozenzeichen % hat eine Sonderbedeutung in der Crontab. Es erzeugt einen Zeilenumbruch. Das folgende Beispiel funktioniert niemals, weil der Suchbegriff falsch interpretiert wird und ausserdem alles nach dem Suchbegriff abgeschnitten wird:
Hier ein Beispiel:

mysql -e "SELECT * FROM users WHERE name LIKE a%;" database

Ich konnte diesen nicht wirklich schönen Workaround dafür finden.

echo "SELECT * FROM users WHERE name LIKE a\%;" | sed -e 's|\\||g' | mysql database

Das Prozenzeichen wird vor Cron geschützt. sed löscht das quote Zeichen wieder, bevor es an die Datenbank weitergeschickt wird.
Für ganz einfache Dinge reicht das. Ich empfehle aber trotzdem gleich ein Script zu erstellen. Dadurch wird dieser komplexe Teil unnötig und insgesamt besser lesbar.

MINUS in MySQL

Written by  on Oktober 4, 2011

In der relationalen Algebra existiert die einfache Möglichkeit, eine Differenz zwischen zwei Tabellen zu bilden. Das geht über den Operator MINUS oder auch Differenz genannt.
Dazu heißt es:

Bei der Operation R-S werden aus der ersten Relation R alle Tupel entfernt, die auch in der zweiten Relation S vorhanden sind.

Aber MySQL sieht keinen solchen Operator vor.
Die Aufgabe lässt sich aber trotzdem einfach lösen:

mysql&gt; select * from r;
+------+------+------+
| a    | b    | c    |
+------+------+------+
| 1    | 2    | 3    |
| 4    | 2    | 3    |
| 4    | 5    | 6    |
| 2    | 5    | 3    |
| 1    | 2    | 6    |
+------+------+------+
5 rows in set (0.00 sec)

mysql&gt; select * from s;
+------+------+------+
| a    | b    | c    |
+------+------+------+
| 2    | 5    | 3    |
| 2    | 5    | 4    |
| 4    | 5    | 6    |
| 1    | 2    | 3    |
+------+------+------+
4 rows in set (0.00 sec)

mysql&gt; select a,b,c from r where (a,b,c) not in (select a,b,c from s);
+------+------+------+
| a    | b    | c    |
+------+------+------+
| 4    | 2    | 3    |
| 1    | 2    | 6    |
+------+------+------+
2 rows in set (0.00 sec)