Outils pour utilisateurs

Outils du site


tips_informatiques:bases_de_donnees:mysql:mysql

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:

  1. créer un champ “unique_index”
  2. créer un index unique sur ce champ “unique_index”
  3. 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
) 
tips_informatiques/bases_de_donnees/mysql/mysql.txt · Dernière modification: 2013/08/06 11:37 par nico