[RESOLU]Supprimer une colonne d'une table (sqlite)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

[RESOLU]Supprimer une colonne d'une table (sqlite)

Message par anissa »

Bonjour,

Je ne comprends pas pourquoi ce code ne marche pas:

Code : Tout sélectionner

Wsql="ALTER TABLE MaTable DROP Matricule INT"
CheckDataBaseUpdate(Idb,Wsql)


Ce qui es bizarre, c'est que j'ai déjà utilisé quelque part cette instruction avec succès. Aujourd’hui, ça ne marche plus, regardez ce code modifié:

Code : Tout sélectionner

Wsql="ALTER TABLE MaTable DROP Matricule"
CheckDataBaseUpdate(Idb,Wsql)


Dans les deux cas, je reçois un message d'erreur:

"Near DROP syntax error"

Pour ne pas perdre de temps, j'ai alors utilisé un autre moyen pour avancer mon projet:
Supprimer complètement la table et la recréer avec la nouvelle structure:

Code : Tout sélectionner

Wsql="DROP TABLE MaTable"
CheckDataBaseUpdate(Idb,Wsql)


Ce dernier code marche bien, (heureusement)...

Qu'en pensez-vous?
Dernière modification par anissa le mer. 25/mai/2011 18:57, modifié 1 fois.
nash
Messages : 42
Inscription : ven. 07/nov./2008 18:02

Re: Supprimer une colonne d'une table (sqlite)

Message par nash »

la version sqlite actuelle
ne permet pas de droper une colonne
donc:

tb1=table a supprimer
tb2=table a recreer(avec colonne en moins)
cs$=colonne a supprimer
i=nombre de colonnes dans tb1
c$=nom de la colonne dans tb1

par mesure de securité, il et preferable de
d'utiliser les commande begin et commit
(si erreur entre les deux appels le drop
ne passe pas et la tb1 et conservée)

OpenDatabase(0,base,"","")
OpenDatabase(1,base,"","")
a=0
DatabaseUpdate(0,"BEGIN")
databasequery(1,"select * from tb1")
for i=0 to DatabaseColumns(1)-1
c$=DatabaseColumnName(1, i)
t=databasecolumntype(1,i)
select t
case #PB_Database_String
t$="text"
case...(et suivant)
endselect
if c$<>cs$
if a=0
databaseupdate(0,"create table tb2 (c$ t$)"):a=1
DatabaseUpdate(0,"insert into tb2 select c$ from tb1")
else
databaseupdate(0,"alter table tb2 add column c$ t$")
DatabaseUpdate(0,"insert into tb2 select c$ from tb1")
endif
endif
next
DatabaseUpdate(0,"drop table tb1")
finishdatabasequery(1):closedatabase(1)
DatabaseUpdate(0,"COMMIT")
CloseDatabase(0)

une autre solution prudente avant de droper tb1
databaseupdate(0,"create temporary table tb2 select tb1")
DatabaseUpdate(0,"insert into tb2 select c$ from tb1")
dans la boucle
attention utilisation possible des chr(34) et ou chr(39)

avant de closer(0)
si la table represente de nombreux enregistrements
utilisation preconisée de la commande
DatabaseUpdate(0,"VACUUM")

d'autres solutions existent egalement..
Dernière modification par nash le mar. 17/mai/2011 8:34, modifié 4 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Supprimer une colonne d'une table (sqlite)

Message par falsam »

Pure Basic intègre la version 3.6.23 du moteur SQlite et ne permet pas de supprimer une colonne lors de l’exécution d'une requête du type ALTER TABLE ..... DROP COLUMN
http://www.sqlite.org a écrit :The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column,
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
nash
Messages : 42
Inscription : ven. 07/nov./2008 18:02

Re: Supprimer une colonne d'une table (sqlite)

Message par nash »

mes excuses mais,c'est vrai
je ne poste pas beaucoup
et je ne rappelle plus l'utilisation des codes et des quotes
je vais donc déjà voir cela
pour la suite
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

[RESOLU] Supprimer une colonne d'une table (sqlite)

Message par anissa »

Tout ça ressemble à ce que j'ai fait forcément car j'ai confirmé que le Drop et Rename ne marchent pas quand il s'agit des colonnes mais pour les tables oui. C'est pour cette raison que j'ai fait comme ça:

Code : Tout sélectionner

;------------- Maj Structure table:  Supprimer une colonne  ------------------------
;
Procedure DeleteCol_FromTable()
;
;------------ NewTable est le nom de la table temporaire de travail 
;------------ MaTable est le nom de la table réelle
;------------ ColDeleted c'est le n° de la colonne à supprimer

;1. Supprimer la table de travail si elle existe
Wsql=  "SELECT Name FROM sqlite_master WHERE Type='table';" 
CheckDatabaseQuery(IdAny, WSql)
While NextDatabaseRow(IdAny)
Wtable$=GetDatabaseString(IdAny,0)
If WTable$="NewTable"
   wsql="DROP TABLE NewTable"
   CheckDatabaseUpdate(IdAny, wsql)
   Break
EndIf
Wend

;2. Créer la table temporaire NewTable qui va contenir la nouvelle structure
Wsql=  "CREATE TABLE NewTable (id INTEGER NOT NULL PRIMARY KEY)"
CheckDatabaseUpdate(IdAny, wsql)

;3.Création de la nouvelle structure (dans cet intervalle seules les colonnes réelles existent)
for wcol=1 to WMaxcol
    wName$=ColName$(Wcol)
    wType$=ColType$(Wcol)
    wSize$=ColSize$(Wcol)

    ;Ajouter la colonne 
    Wsql=  "ALTER TABLE NewTable" +  " ADD " + wName$ + Space(1) + WType$ 
    CheckDatabaseUpdate(IdAny, wsql)
next wcol

;4. Récupérer les données à partir de la table originale
NewCol=0
Wsql="SELECT * FROM MaTable order by Id"
CheckDatabaseQuery(IdAny, WSql)
While NextDatabaseRow(IdAny)
Wid=GetDatabaseLong(IdAny,0)
For Wcol=1 To DatabaseColumns(IdAny) -1
    WData$(Wcol)=Trim(GetDatabaseString(IdAny,Wcol))
    If Wcol<>ColDeleted
       NewCol=NewCol+1
       wNewData$(NewCol)=WData$(Wcol)
    EndIf            
Next Wcol

wMaxCol=NewCol
For Wcol=1 To wMaxCol
Wsql="SELECT * FROM NewTable Where ID=" + Chr(34)+ Str(wid) + Chr(34)
CheckDatabaseQuery(IdAny, WSql)
If NextDatabaseRow(IdAny)
   wSql="Update NewTable set " + DatabaseColumnName(IdAny,Wcol) + " = " + Chr(34) + wNewData$(wCol) + Chr(34)
   wsql+"Where ID=" + Chr(34)+ Str(wid) + Chr(34)
   CheckDatabaseUpdate(IdAny, wsql)
Else
   wSql="INSERT INTO NewTable (" + DatabaseColumnName(IdAny,Wcol)+") Values ("  + Chr(34) + wNewData$(wCol) + Chr(34) + ")"
   CheckDatabaseUpdate(IdAny, wsql)
EndIf   
Next wcol
Wend

;5. Supprimer la table MaTable
Wsql=  "Drop Table MaTable"
CheckDatabaseUpdate(IdAny, wsql)

;6.Renommer la nouvelle table sous le nom original
;wsql="ALTER TABLE NewTable RENAME To MaTable"
;CheckDatabaseUpdate(IdAny, wsql)

MessageRequester("Terminé","La colonne N°" + str(DeletedCol) + " a été supprimée !")
EndProcedure


Je ne peux pas vous dire que c'est parfait car ce n'est pas vrai au contraire, ça n'a pas marché à tous les coups ! Des fois oui des fois non... Il y a sûrement qq chose qui cloche dans mon code...
Répondre