====== Start / Stop ====== __OS__: Ubuntu 5.04 __Démarrer__: /etc/init.d/mysql start __Arrêter__: /etc/init.d/mysql stop __Redémarrer__: /etc/init.d/mysql restart ====== Connexion impossible depuis Java ====== __OS__: Ubuntu 5.04 __Problème__: Après installation de MySQL et de phpMyAdmin depuis les paquets Ubuntu, impossible de se connecter depuis du code Java, via JDBC. __Solution__: Par défaut, MySQL ne permet pas les connexions réseau. Il faut donc modifier le fichier de config /etc/mysql/my.cnf et commenter la ligne: # The skip-networking option will no longer be set via debconf menu. # You have to manually change it if you want networking i.e. the server # listening on port 3306. The default is "disable" - for security reasons. # skip-networking De plus, il faut créer un user ayant le droit de se connecter depuis alaxoscom.yourwebhostingmysql.com.localdomain et non-pas depuis alaxoscom.yourwebhostingmysql.com. Ceci est apparemment propre à certaines distributions Linux. ====== Insérer la date/heure de l' INSERT ====== __Soft__: MySQL Ver 14.7 Distrib 4.1.11, for pc-linux-gnu (i386) __Problème__: Contrairement à d'autres DB, MySQL ne permet pas de rentrer une fonction par défaut pour un champ, mais seulement une valeur par défaut. On ne peut donc pas avoir par défaut l'heure de l'insertion dans un champ. __Solution__: MySQL permet de spécifier une fonction dans la requête SQL. Ainsi, si le champ 'insert_date' est de type DATE ou DATETIME, on peut écrire: INSERT INTO my_table (insert_date, ..., ...) VALUES (now(), ..., ...) ====== Exécuter un batch SQL depuis un shell ====== __OS__: Debian Si l'on a accès au terminal d'un serveur, il est plus rapide et plus facile de parser un fichier contenant des commandes SQL depuis celui-ci qu'en passant par exemple par un PhpMyAdmin. __Commande__: mysql --user username -ppassword -D db_name < /path/to/file/sql.txt Rem: -p permet de rentrer le mot de passe. Il ne faut pas d'espace entre -p et password ====== Créer un trigger pour spécifier la date d'INSERT ====== __Soft__: MySQL Ver 5.1 __Commande__: CREATE TRIGGER `trig_mytable_insert` BEFORE INSERT ON `mytable` FOR EACH ROW SET new.created = NOW() ====== Créer un trigger pour spécifier la date d'UPDATE ====== __Soft__: MySQL Ver 5.1 __Commande__: CREATE TRIGGER `trig_mytable_update` BEFORE UPDATE ON `mytable` FOR EACH ROW SET new.modified = NOW() ====== Créer un 'index unique' sur 2 paires différentes dans la même table ====== __Soft__: MySQL Ver 5.1 __Problème__: Comment s'assurer que les paires field1-field2 soient uniques et que les paires field1-field3 soient uniques, sachant que field2 __ou__ field3 peuvent être données. __Solution__: - créer un champ "unique_index" - créer un index unique sur ce champ "unique_index" - créer des triggers BEFORE INSERT et BEFORE UPDATE pour remplir automatiquement ce champ "unique_index", en fonction de la présence de valeurs pour les champs field2 ou field3 CREATE TABLE IF NOT EXISTS `my_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `unique_key` varchar(50) NOT NULL, `field1` int(11) NOT NULL, `field2` int(11) default NULL, `field3` varchar(256) default NULL, PRIMARY KEY (`id`), UNIQUE KEY `unique_key` (`unique_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; delimiter $$ CREATE TRIGGER insert_unique_key BEFORE INSERT ON my_table FOR EACH ROW BEGIN IF NEW.field2 IS NULL OR NEW.field2 = '' THEN SET NEW.unique_key=CONCAT(NEW.field1, '$$$', MD5(NEW.field3)); ELSE SET NEW.unique_key=CONCAT(NEW.field1, '***', NEW.field2); END IF; END; $$ delimiter $$ CREATE TRIGGER update_unique_key BEFORE UPDATE ON my_table FOR EACH ROW BEGIN IF NEW.field2 IS NULL OR NEW.field2 = '' THEN SET NEW.unique_key=CONCAT(NEW.field1, '$$$', MD5(NEW.field3)); ELSE SET NEW.unique_key=CONCAT(NEW.field1, '***', NEW.field2); END IF; END; $$ ====== DELETE avec sous-query ====== __Soft__: MySQL Ver 5.0 __Problème__: Un DELETE avec une sous-query qui concerne la table dans laquelle des records doivent être effacés ne fonctionne pas directement. Cette requête ne marche pas: DELETE FROM bibliographies WHERE bibliographies.id IN ( SELECT bibliographies.id FROM bibliographies WHERE document_id IN ( SELECT documents.id FROM documents WHERE document_subtype_id = 19 ) ) L'erreur suivante est obtenue: //#1093 - You can't specify target table 'bibliographies' for update in FROM clause// __Solution__: Il suffit de rajouter un SELECT autour de la sous-query pour que la requête passe: DELETE FROM bibliographies WHERE bibliographies.id IN ( SELECT * FROM ( SELECT bibliographies.id FROM bibliographies WHERE document_id IN ( SELECT documents.id FROM documents WHERE document_subtype_id = 19 ) ) AS tmp )