Posts tagged ‘mysql’

Clé composites en SQL

L’intérêt d’une clé composite / composée est de pouvoir utiliser plusieurs champs différents en tant que clé primaire d’une table. En effet, si l’association de deux colonnes est unique, pourquoi recréér artificellement un id qui ne servirait que de clé primaire ?

Illustration :


CREATE TABLE example1(
field1 text not null,
field2 text not null,
PRIMARY KEY (field1, field2)
);

17 février 2010 at 16 h 12 min Laisser un commentaire

Requete SELECT subtile… comment afficher de manière unique un résultat d’une requête SQL ?

Si vous avez une requête SQL donnant un résultat avec des doublons et que vous souhaitez éliminer les doublons pour avoir ces résultats de manière unique, pensez à utiliser le mot clé DISTINCT.

Exemple imaginons que vous souhaitiez extraire les emails de vos clients n’ayant pas acheté depuis une certaine date. Vous disposez d’une table « orders » et « clients »… Notre requête ressemblera à cela

SELECT email, name FROM clients,order WHERE order.date < 20090601 (ou un timestamp quelconque…);

Si dans votre réponse vous obtenez plusieurs fois le meme mail, hop, DISTINCT vous assurera de l’unicité de vos résultats ! Chacun des champs de la table retournée sera unique.

La requête devient donc :

SELECT DISTINCT email, name FROM clients,order WHERE order.date < 20090601 (ou un timestamp quelconque…);

Pratique non ?

22 novembre 2009 at 16 h 22 min Laisser un commentaire

Place dans un classement et rang parmi des enregistrements MySQL

Si vous voulez réaliser un Top 1000 pour votre jeu en ligne ou plus généralement connaitre quelle est la place d’un de vos tuple dans un ensemble trié d’enregistrements, voici une petite astuce qui vous permettra d’obtenir le résultat avec un moyen 100 % SQL ( pas besoin de variable compteur coté serveur).

Imaginez une table players contenant les colonnes « pseudo, score et time_played ». Notre objectif est de connaitre la position d’un joueur dans le classement total connaissant le champ « pseudo ». L’obtention de son rang va se faire en 3 temps :

1. On va commencer par initialiser une variable MySQL avec la commande SET:
SET @counter = 0;

2. L’étape suivante consiste à effectuer une première requête qui va compter et créer une colonne indiquant le rang de chacun des enregistrements au sein de la table.
SELECT pseudo,score,time_played,@counter:=@counter+1 AS rang FROM players ORDER BY score ASC;

3. Enfin, nous allons isoler l’enregistrement qui nous intéresse, à savoir, celui dont la valeur pseudo est celle que nous cherchons.

Il s’agit d’une simple requête du type

SELECT place,pseudo FROM (*****) AS subrequest WHERE pseudo = ‘John Doe’;

Si vous avez suivi, vous aurez d’ores et déja compris qu’il va falloir remplacer les ***** par notre requête construite à l’étape 2 (il s’agit de ce qu’on appelle une sous- requete). Le résultat obtenu devrait être une table contenant le rang et le pseudonyme de notre joueur ‘John Doe’.

N’hésitez pas à envoyer un commentaire si vous avez besoin d’aide !

Références :
Documentation MySQL

4 juin 2009 at 17 h 06 min 1 commentaire

Sécuriser MySQL : création d’un utilisateur dédié à une base de donnée

Dans l’ensemble de cet article on supposera l’utilisateur MySQL root existant avec le mot de passe: rootPass

Etape 1 : Créer l’utilisateur

Connectez vous en root sur la table appelée « mysql », et tapez la commandes suivantes.

INSERT INTO user(host,user,password) VALUES (‘localhost’,’nom_user’,PASSWORD(‘pass_user’));

Etape 2 : Créer la base de donnée

En root, il suffit d’entrer les commandes CREATE DATABASE nom_database;.
Pour générer les tables, que vous avez déjà probablement crée lors de la phase de développement, je vous conseille d’exporter la structure depuis le SGBD de dev, puis de l’insérer dans le SGBD de production en utilisant:
mysql -u root -prootPass nom_database <votrefichier.sql

Etape 3 : Attribuer les droits : insertion, suppression, et lecture sur l’ensemble de la base

L’attribution des droits s’effectue avec l’usage de la commane GRANT, comme suit:

GRANT SELECT, INSERT, UPDATE ON nom_database.* TO nom_user@’localhost’ ;

Validez l’attribution de ces droits par:
flush privileges;

Références

http://dev.mysql.com/doc/refman/5.0/fr/adding-users.html

23 février 2009 at 12 h 01 min Laisser un commentaire

Récupérer l’id (autoincrement) après un insert

Fiche recette du 12 février 2009:

Comment récupérér la valeur d’un champ déclaré « auto_increment » lors d’un INSERT INTO exécuté depuis Java ?

L’API JDBC fournit une méthode extrèmement pratique appelée getGeneratedKeys():

PreparedStatement stat = connectionSql.prepareStatement("INSERT INTO maTable SET " +
"login = ?," +
"email = ?");
int i=1;
stat.setString(i++, leLogin);
stat.setString(i++, leMail);
int nb_lignes = stat.executeUpdate();
ResultSet rs = stat.getGeneratedKeys();
int idAuto_increment = 0;
if( rs.next() ) {
idAuto_increment = rs.getInt(1);
}

Un enchainement de méthodes très certainement utile à connaitre… et que je recherche à chaque fois que je travaille avec MySql et son connecteur Java…

12 février 2009 at 20 h 30 min 2 commentaires

Crappy loop inside mysql request… Play with mysql procedure.

If you miss something during the conception of your mysql database, or wish to add some new tables for additional features in your web application, it could be a mess to build the new version on your database without droping all data of the existing tables.

I personnaly needed to keep thousand of registered users (in a table) and nevertheless i had to provide some messaging feature in another table.

I decided to:

1. Create the new table in my existing database:

CREATE TABLE `newone` (
`id` INT NOT NULL ,
`field1` TINYINT NOT NULL ,
`field2` BLOB NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

2. Set my default values for each field:

ALTER TABLE `newone` CHANGE `field1` `field1` TINYINT( 4 ) NOT NULL DEFAULT ‘999999’

3. Insert as many lines as registered user, so that every registered user have their own line in the « newone » table:
i used the LOOP mysql statement to achieve this:

delimiter !!

CREATE PROCEDURE massiveInsert(IN maxInserts INT)
BEGIN
DECLARE i INT;
SET i=1;
myloop: LOOP
SET i=i+1;
IF i=maxInserts THEN
LEAVE myloop;
END IF;
insert into newone values();
END LOOP myloop;
END!!

Doesn’t it looks like 80’s GW*-Basic, ehhh ?

To run this procedure, just type:
call massiveInsert();

What do you need to remind concerning MySQL procedures:

– Define you OWN delimiter, unsing the delimiter. Otherwise, you will get the Error Code : 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near blahblahblah

– Use the keyword IN to input parameters, and next the variable name + parameter type.

– Use the call() instruction to execute your procedure.

References:

mysql manual

2 octobre 2008 at 18 h 02 min Laisser un commentaire

Installer le connecteur mysql java sur un serveur Tomcat

Nous allons installer le support de mysql au serveur Tomcat.

Il est important de ne pas dupliquer l’installation du connecteur (ne pas inclure dans le code source s’il n’est pas inclus.

il suffit de copier le fichier jar dans le dossier catalina_home/common/libs

Ainsi on fait un:

wget http://mir2.ovh.net/ftp.mysql.com/Downloads/Connector-J/mysql-connector-java-5.1.6.tar.gz

puis tar -zxvf ./mysql-connector-java-5.1.6.tar.gz

et enfin mv ./mysql-connector-java-5.1.6.tar.gz /catalinahome/common/libs/

et ca devrait être bon 🙂 N’oubliez pas de remplacer catalina_home par votre propre répertoire d’installation de Tomcat bien entendu…

23 septembre 2008 at 19 h 33 min Laisser un commentaire