Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > SQLite
SQLite Forum d'entraide SQLite
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/08/2011, 09h50   #1
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut UPDATE OR REPLACE: insertion ne fonctionne pas

Bonjour,

J'ai un problème sur le comportement de l'UPDATE OR REPLACE SET ... WHERE ... d'SQLite. Les quotes s'expliquent par le fait que j'accède à la BDD par JAva via jdbc.

La déclaration de la table:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE IF NOT EXISTS dmd(" +
	" ID_numGrefie INTEGER NOT NULL," +
	" ref_stdname TEXT DEFAULT 'Default' NOT NULL," +
	" ref_LinkedDCR INTEGER NOT NULL DEFAULT 0," +
	" ref_calc TEXT NOT NULL, "+
	" title TEXT NOT NULL, " +
	" linked_Ata TEXT NOT NULL, "+
	" board_state TEXT CHECK (UPPER(board_state) IN ('DRAFT_BEING', 'DRAFT_VALIDATED', 'BOARDS_DRAWN' , 'BOARDS_REREADED')) DEFAULT 'DRAFT_BEING'," +
	" noAction INTEGER DEFAULT 0," +
	" checked INTEGER DEFAULT 0," +
	" pge_written INTEGER DEFAULT 0," +
	" tra_written INTEGER DEFAULT 0,"+
	" filled_in_grefie INTEGER DEFAULT 0," +
	" PRIMARY KEY (ID_numGrefie, ref_stdName, ref_linkeddcr, ref_calc),"+
	" FOREIGN KEY(ref_stdname, ref_linkeddcr, ref_calc) REFERENCES standard (Id_stdname, ID_LinkedDCR, ref_calculator) ON UPDATE CASCADE ON DELETE CASCADE);"
La requête sql :
Code :
UPDATE OR REPLACE dmd SET ID_numGrefie ="+numDMD+", title= '"+titre+"', linked_Ata='"+ata+"' WHERE ID_numGrefie="+numDMD+" AND ref_calc='"+calculator+"';
L'update se fait bien sur les lignes dmd dont l'ID_numGrefie et ref_calc existent. S'il n'existe pas de lignes qui soit satisfaites par les conditions de la clause WHERE: il devrait y avoir une insertion avec données spécifiée dans le SET, et les autres colonnes non renseignées pour l'insertion prennent leur valeur par défaut si j'ai bien compris la doc sqlite.

Le problème est là: rien ne se passe pour l'insertion (REPLACE)! Ex: si la dmd n° ID_numGrefie n'existe pas, elle devrait être créée mais ce n'est pas le cas!

N'ais-je pas bien saisi le rôle d' UPDATE OR REPLACE? Ou le problème vient d'ailleurs?

Merci de votre aide
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 10h00   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Ce que vous cherchez a réaliser se rapproche plus d'un "INSERT or REPLACE", que d'un "UPDATE or REPLACE"... Mais je ne suis pas spécialiste SQLite
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 10h23   #3
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Le problème avec l'insert or replace, c'est que si une ligne de dmd existe déjà, les colonnes non spécifiées seront remplacées par celles par défaut alors que je voudrais conserver les anciennes!
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2011, 16h42   #4
Invité de passage
 
Ingénieur développement logiciels
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Pour ceux que ça peut intéresser, n'ayant pas eu de réponse j'ai résolu (ou plutôt contourné le problème) en passant par le code client:

Code :
1
2
3
4
5
6
7
ResultSet rs = stat.executeQuery("SELECT * FROM dmd WHERE ID_numGrefie ="+numDMD+" AND ref_calc='"+calculator+"';");
 
IF(rs.next()){
       stat.executeUpdate("UPDATE dmd SET ID_numGrefie='"+numDMD+"', title='"+title+"', linked_Ata='"+ata+"' WHERE ref_calc='"+calculator+"' AND ID_numGrefie='"+numDMD+"';");
}else{ 
       stat.executeUpdate("INSERT INTO dmd(ID_numGREFIE, ref_calc, title, linked_ata) VALUES ("+numDMD+",'"+calculator+"','"+title+"','"+ata+"');");
}
Timo31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h56.


 
 
 
 
Partenaires

Hébergement Web