Erreur dans la requete SQL ALTER TABLE/RENAME TO

papachimique 2 Messages postés mercredi 4 juillet 2018Date d'inscription 13 juillet 2018 Dernière intervention - 4 juil. 2018 à 17:00 - Dernière réponse : KX 15737 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention
- 13 juil. 2018 à 20:07
Bonjour,
J'ai un problème avec la requête SQL ALTER TABLE / RENAME TO censé changer le nom de ma table.

String ancienNom = "05010102";
String nouveauNom = "05010101";
String requete = "ALTER TABLE " + ancienNom + " RENAME TO " + nouveauNom ;
try
{
req.executeUpdate(requete);
}
catch(Exception e) {System.out.println(e.toString()); }

J'ai le message : Erreur de syntaxe dans l'instruction ALTER TABLE.

J'ai également essayé avec les syntaxes :
String requete = "ALTER TABLE " + ancienNom + " RENAME AS " + nouveauNom;
et String requete = "RENAME TABLE " + ancienNom + " TO " + nouveauNom;

La base de mon programme doit etre bonne car j'ai également une requete
req.executeUpdate("DROP TABLE " + Principale.monChoixIndex);
qui , elle, fonctionne très bien.

Merci d'avance car je pensais passer 2 secondes sur cette requête , et cela fait déjà plusieurs heures que je cherche en vain !
Afficher la suite 

Votre réponse

8 réponses

NHenry 14262 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 22 septembre 2018 Dernière intervention - 4 juil. 2018 à 18:12
0
Merci
Quel est la requête telle qu'elle est exécuter (que tu envoie dans le moteur) ?
Commenter la réponse de NHenry
KX 15737 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - 4 juil. 2018 à 18:35
0
Merci
Bonjour,

En SQL il y a plusieurs types de commandes SQL :
  • DML (Data Manipulation Language) comme SELECT, INSERT, UPDATE ou DELETE
  • DDL (Data Definition Language) comme CREATE, ALTER, DROP ou RENAME

En Java on retrouve donc des méthodes différentes dans la classe Statement, chacune s'utilisant dans un cas ou dans l'autre et il faut bien regarder la documentation pour savoir ce que l'on fait :
 
Parameters:
sql - an SQL statement to be sent to the database, typically a static SQL SELECT statement
Returns:
a ResultSet object that contains the data produced by the given query; never null

 
Parameters:
sql - an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.
Returns:
either (1) the row count for SQL Data Manipulation Language (DML) statements or (2) 0 for SQL statements that return nothing

 
Parameters:
sql - any SQL statement
Returns:
true if the first result is a ResultSet object; false if it is an update count or there are no results

Dans ton code, tu as utilisé
executeUpdate
, qui est spécifiquement indiqué comme étant une méthode pour faire des commandes DML. Or toi tu veux faire des commandes DDL. Il faut donc utiliser la méthode
execute
.
Réponse pour KX,
D'abord merci, étant débutant en java , j'ai appris des choses ...... cependant j'ai modifié le code en changeant executeUpdate en execute

String ancienNom = "05010102";
String nouveauNom = "05010101";
String requete = "ALTER TABLE " + ancienNom + " RENAME TO " + nouveauNom ;

try
{
req.execute(requete);
}
catch(Exception e) {System.out.println(e.toString()); }

... et j'ai toujours le message d'erreur : Erreur de syntaxe dans l'instruction ALTER TABLE.

remarque dans mon programme req est du type "Statement" mais je ne pense pas que l'erreur puisse venir de là.
KX 15737 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention > papaChimique - 4 juil. 2018 à 19:01
Quelle base de données utilises tu ? Car les commandes peuvent changer d'un éditeur à l'autre.

En général ce devrait être
ALTER TABLE table_name RENAME TO new_table_name;


Mais en SQL Server par exemple ce sera
sp_rename 'table_name', 'new_table_name';


Remarque : 05010102 c'est bizarre de commencer le nom d'une table par un chiffre.

Dans tous les cas, il faut que tu testes ta commande SQL directement dans ta base de données et ne la programmer en Java qu'une fois qu'elle fonctionne.
Commenter la réponse de KX
papachimique - 7 juil. 2018 à 10:11
0
Merci
J'ai essayé directement la commande dans ma base de donnée (microsoft access

L'instruction "ALTER TABLE registre RENAME AS registre2" me renvoi "Erreur de syntaxe dans l'instruction ALTER TABLE.

idem pour L'instruction "ALTER TABLE registre RENAME TO registre2"

L'instruction "sp_rename registre,newRegistre" me renvoi instruction SQL non valide !!!!

Je fais quoi !!! help
KX 15737 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - 7 juil. 2018 à 11:42
C'est bizarre d'avoir choisi une base de données Microsoft pour faire un programme Java...

Avec Access essayes de faire ton traitement en deux temps :

SELECT * INTO registre2 FROM registre;
DROP TABLE registre;

Si ça fonctionne tu pourras le faire en Java en une seule commande :

stmt.execute("SELECT * INTO registre2 FROM registre; DROP TABLE registre;");
Commenter la réponse de papachimique
papachimique - 13 juil. 2018 à 18:36
0
Merci
Merci beaucoup à KX, ça fonctionne...
le code complet pour ceux qui rame comme moi :

public void renommer(String nonDépart, String nonFinal)
{
try
{
String requete = "SELECT * INTO " + nonFinal + " FROM " + nonDépart;
pstmt = connec.prepareStatement(requete);
pstmt.execute();
}
catch (SQLException e){e.printStackTrace(); }

try
{
req.executeUpdate("DROP TABLE " + nonDépart);
}
catch(Exception e) {System.out.println(e.toString()); }

}
}

Une question bonus (spécial KX): pourquoi avoir écrit "C'est bizarre d'avoir choisi une base de données Microsoft pour faire un programme Java" , y-a-t-il une autre solution plus "naturelle" pour programmer en java. Moi j'avais pris ACCES parce que c'est la seule que je connaissais (j'avais dit que j'étais débutant et donc je confirme)
KX 15737 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 24 septembre 2018 Dernière intervention - 13 juil. 2018 à 20:07
MS Access est une base de données propriétaire qui ne fonctionne que sous Windows avec un certain nombre de limites (pas d'index, pas de tables temporaires, 2Go max...) et que l'on retrouvera plutôt en collaboration avec d'autres technologies Microsoft (VBA par exemple).

Les programmes Java travailleront soit avec des bases de données ultra légères embarquées dans le programme (H2, Derby...) et donc multiplate-forme pour s'adapter au plus grand nombre d'utilisateurs (pas que Windows donc), soit à l'opposé - et notamment en Java EE - avec des bases de données extrêmement performantes (Oracle, PostgreSQL...) pour manipuler des données beaucoup plus volumineuses que ne peut faire Access.

Remarque 1 : par rapport à ton code, il faut penser à fermer tes Statement parce que Java ne le fera pas tout seul, il pensera que tu vas t'en resservir alors ce n'est pas le cas, donc à chaque appel tu vas en ouvrir un nouveau qui ne sera jamais fermé jusqu'au moment où il en aura tellement d'ouverts qu'il refusera d'en ouvrir un nouveau...

Remarque 2 : si ton SELECT INTO échoue tu affiches une erreur mais tu continues, c'est à dire que tu vas quand même faire le DROP TABLE alors que tu n'as pas créé la nouvelle table, donc tu vas perdre toutes tes données !
C'est pour ça que je conseillais de faire une seule requête, si la première partie plante, la suite ne sera jamais appelé.

public boolean renommer(String nomDepart, String nomFinal) {
    String sql = "SELECT * INTO " + nomFinal + " FROM " + nomDepart + ";"
        + " DROP TABLE " + nomDepart + ";";
    // try-with-resources: appellera stmt.close() automatiquement
    try (Statement stmt = getConnection().createStatement()) {
        return stmt.execute(sql);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
} 
Commenter la réponse de papachimique

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.